C 英国理工学院;大于其直接子元素之和的BST元素之和

C 英国理工学院;大于其直接子元素之和的BST元素之和,c,function,binary-search-tree,C,Function,Binary Search Tree,因此,任务是编写一个函数,返回大于其直接子元素之和的BST元素之和。不计算叶节点数。我是这样做的,当树为空时,基本情况返回0,如果没有子,也返回0。然后我检查节点是否有一个或两个子节点以及求和的条件 int sum(struct node* root) { if (root== NULL) return 0; if (root->right == NULL && root->left==NULL) return 0; if (root->right!= NUL

因此,任务是编写一个函数,返回大于其直接子元素之和的BST元素之和。不计算叶节点数。我是这样做的,当树为空时,基本情况返回0,如果没有子,也返回0。然后我检查节点是否有一个或两个子节点以及求和的条件

int sum(struct node* root) 
{
if (root== NULL) return 0;
if (root->right == NULL && root->left==NULL) return 0;
if (root->right!= NULL && root->left != NULL)
{
    if (((root->right)->key + (root->left)->key) < root->key) return root->key;
}
if (root->right != NULL && root->left==NULL)
{
    if ((root->right)->key< root->key) return root->key;
}
if (root->left != NULL && root->right==NULL)
{
    if ((root->left)->key < root->key) return root->key;
}
else return sum(root->right) + sum(root->left);
}

它应该返回-1(6+8-11-4),但我的函数不起作用,我不知道为什么。

在您的代码中,
else
子句将永远不会执行;你以前的条件已经处理了所有的可能性

但是,应该执行表达式。您需要添加
+sum(root->left)+sum(root->right)
作为三个非退化
return
语句的一部分,或者您需要将
root->key
保存在局部变量中(默认为零),然后转到
return\u value+sum(root->left)+sum(root->right)

因此(使用“返回值”的缩写
rv

int sum(struct node* root)
{
    int rv = 0;
    if (root == NULL || (root->right == NULL && root->left == NULL))
        return rv;
    if (root->right != NULL && root->left != NULL)
    {
        if ((root->right->key + root->left->key) < root->key)
            rv = root->key;
    }
    if (root->right != NULL && root->left == NULL)
    {
        if (root->right->key < root->key)
           rv = root->key;
    }
    if (root->left != NULL && root->right == NULL)
    {
        if (root->left->key < root->key)
            rv = root->key;
    }
    return rv + sum(root->right) + sum(root->left);
}
int和(结构节点*根)
{
int-rv=0;
if(root==NULL | |(root->right==NULL&&root->left==NULL))
返回rv;
if(root->right!=NULL&&root->left!=NULL)
{
如果((根->右->键+根->左->键)key)
rv=根->键;
}
if(root->right!=NULL&&root->left==NULL)
{
如果(根->右->键<根->键)
rv=根->键;
}
if(root->left!=NULL&&root->right==NULL)
{
如果(根->左->键<根->键)
rv=根->键;
}
返回rv+sum(根->右)+sum(根->左);
}
警告:原始代码,未被任何编译尝试所污染


对于最后三个'outer'
if
测试,可以使用
else-if
链(使用
else
子句代替最后一个测试)为了避免重复测试。是否存在可测量的差异是有争议的;优化器甚至可能自行进行更改。

在英语中,在描述树结构和过程层次结构时,避免使用术语“儿子”和“女儿”(以及“父亲”和“母亲”等)。使用性别中立的“父母”和“孩子”(和‘祖父母’、‘孙子’)等(兄弟姐妹代表‘兄弟’或‘姐妹’)。您可以也应该编写
(root->right)->键
作为明确的
根->右->键
。括号不是必需的;它们是有经验的C程序员所无法预料的。如果你在处理像指向结构的指针这样的奇怪东西,有时需要括号-所以
(*proot)->右->键
-或类似的东西。但对于常规情况,括号有点模糊。
int sum(struct node* root)
{
    int rv = 0;
    if (root == NULL || (root->right == NULL && root->left == NULL))
        return rv;
    if (root->right != NULL && root->left != NULL)
    {
        if ((root->right->key + root->left->key) < root->key)
            rv = root->key;
    }
    if (root->right != NULL && root->left == NULL)
    {
        if (root->right->key < root->key)
           rv = root->key;
    }
    if (root->left != NULL && root->right == NULL)
    {
        if (root->left->key < root->key)
            rv = root->key;
    }
    return rv + sum(root->right) + sum(root->left);
}