首页 > 解决方案 > 树函数检查一个节点的值是否等于前两个节点的值

问题描述

我想创建一个函数,从每个路径(左或右)中的第三个节点检查它是否等于树中前两个节点的总和。

这是我的代码,但它不起作用:

    typedef struct node
    {
        int data;
        struct node *left;
        struct node *right;
    } node;
    
    int goldtree(node *root)
    {
        int sumleft=0,sumright=0;
        if (root->left==NULL || root->right ==NULL)
            return 0;
        
        sumleft+=root->data+goldtree(root->left);
        sumright+=root->data+goldtree(root->right);
        if (goldtree(root->right)==sumright || sumleft==goldtree(root->left))
            return 1;
    }

这是一个例子:

[ 在此处输入图像描述]

标签: c

解决方案


好吧,对不起,我第一次以错误的方式理解您的问题!删除了上一个答案:/

所以,你想检查树是否golden,如果我没有错,规则如下:

  • 每个当前节点都是前两个节点的总和,根节点除外。
  • 如果存在从根到离开节点的这样一条路径,那么这棵树就是金色的。

你可以改变你的功能,如下所示:

int goldtree(node *root, int flag){
    int result = 0;
    if(root == NULL) return 0;
  
    /* we have come up to leave node */
    else if(root->left == NULL && root->right == NULL) return 1;

    else{
        /* we would traverse only the path where child node's value - current node's value is equal to prev node' value */            
        if(root->left != NULL && root->left->data - root->data == flag) {
            result = goldtree(root->left, root->data);
        }

        if(root->right != NULL && root->right->data - root->data == flag){
            result = goldtree(root->right, root->data);
        }
        return result;
     }
  
}

要调用的驱动程序函数goldtree是:

    goldtree(root, 0);

注意:为什么我们在遍历路径之前检查节点的值是,我们只会考虑那些子节点的值等于当前节点+上一个节点值的路径;

如果您的路径如下所示:

      1
     /
    2
   /
  3

当您在节点中时,2您可以考虑子节点的前两个节点值3

3 - 2 == 1 --> true

推荐阅读