当前位置: 首页 > 知识库问答 >
问题:

检查二叉树中的子代求和属性

劳昊明
2023-03-14

Childer Sum属性说,对于每个节点,数据值必须等于左右子节点中数据值的总和。我已经实现了一个递归函数,它检查二叉树是否满足该属性。但是代码为每棵树返回1。请帮助并告诉逻辑是否有问题?:)这是函数

   int child_sum(struct tree *node)

    {
      if(node==NULL)
        {
          return 0;

       }

if(node->left!=NULL && node->right!=NULL)
        {
      if(node->data=node->left->data+node->right->data)
      {
      return 1;
        }
       }

  return child_sum(node->left) && child_sum(node->right);
}

共有2个答案

栾耀
2023-03-14

这是我对包含儿童Sum方法的二叉树的实现。

struct BTree
{
    struct NodeTree
    {
        NodeTree (int in) : data(in) { left = nullptr; right = nullptr;}
        NodeTree* left;
        NodeTree* right;
        int data;
    };

    NodeTree* head;


    BTree(std::initializer_list<int> inList)
    {
        head = nullptr;
        for (auto elem : inList)
        {
            NodeTree* nodeTree = new NodeTree(elem);
            insert(nodeTree);
        }
    }

    void insert( NodeTree* newElem )
    {
        if (head == nullptr)
        {
            head = newElem;
            return;
        }
        insert2End(head, newElem);
    }

    void insert2End( NodeTree* current, NodeTree* newElem )
    {
        std::deque<NodeTree*> queue;
        queue.push_back(current);
        NodeTree* lastElem = nullptr;
        while (!queue.empty())
        {
            lastElem = queue.front();
            queue.pop_front();
            if (lastElem->left)
                queue.push_back(lastElem->left);
            else
            {
                lastElem->left = newElem;
                break;
            }

            if (lastElem->right)
                queue.push_back(lastElem->right);
            else
            {
                lastElem->right = newElem;
                break;
            }
        }
    }


    int postOrderTreeTraverser(NodeTree* in)
    {
        int totalSum = 0;
        if (in->left)
            totalSum += postOrderTreeTraverser(in->left);
        if (in->right)
            totalSum += postOrderTreeTraverser(in->right);

        int returnVal = in->data;
        if (in->left != nullptr || in->right != nullptr )
            in->data = totalSum;

        return returnVal;

    }



    void childrenSum()
    {
        if (head == nullptr)
        {
            return;
        }
        postOrderTreeTraverser(head);
    }

};
司寇望
2023-03-14

< code>if(节点-

注意==。在您的情况下,它是赋值(=),始终为真。

 类似资料:
  • QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS

  • 我想写一个方法来确定一棵树是否至少有一对相同的子树,这些子树的值和结构都必须相同。 假设给你一棵树,如下所示: 这将返回,因为我们有一对根为的相同树。 我的想法是遍历每个节点,构建一个映射到

  • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?

  • 编写一个Lisp程序来检查一个二叉树是否是二叉搜索树。 我正在尝试编写一个二进制递归方法,但我是一个初学者,我不知道从这里去哪里。

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我需要编写伪代码来检查有效的二叉树是否是搜索二叉树。 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题。 我需要更新数组的索引,以便按照值在树上的顺序将其提交给数组。 我不确定在递归过程中索引是否真的得到了正确更新。。到底是不是?如果你发现问题,能帮我解决吗?谢谢 伪代码 第一功能 IsBST(节点) 大小← 树化(节点