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

如何检查完整的二叉树是否值平衡

穆宾白
2023-03-14

如何检查由数组表示的给定完整二叉树是否是值平衡二叉树?我所说的值平衡是指,如果对于每个节点,左手边节点的整数值之和等于右手边的值之和。什么是类C算法?找出有孩子的节点的索引很容易。但是我无法开发递归计算每个节点总和的逻辑。还需要以这样一种方式计算总和,即特定节点下方左子树的所有节点的总和将等于它的右手对应物,并以类似的方式向下挖掘。怎么可能使用数组?

共有1个答案

卢晟
2023-03-14

您可以对树进行后序遍历,对每个子树求和,当返回(每个子树的)根时,评估两个子树是否具有相同的权重。

类 C 伪代码

res = 1; //global variable, can also be used as sending pointer to res instead
int verifySums(Node* root) {
   if (root == null) return 0;
   int leftSum = verifySums(getLeft(root));
   int rightSum = verifySums(getRight(root));
   if (leftSum != rightSum) res = 0;
   return leftSum + rightSum + getValue(root);
}

在哪里

    < Li > < code > Node get left(Node *)返回一个指针,该指针指向一个表示参数左侧子节点的节点 < Li > < code > Node getRight(Node *)返回一个指针,该指针指向表示参数的右子节点的节点 < Li > < code > int getValue(Node *)返回给定节点的值

这个想法是做一个后序遍历,向左求和所有子级的值,向右求和,然后:

  1. 验证正确性-如果不正确,整个树的答案是否定的,并将其设置为res
  2. 将当前节点的两个总和相加,并将其返回给父节点
 类似资料:
  • 我实现了下面的C代码,以检查二叉树是否平衡,即左右子树的高度相差最多1。但是,我不确定它是否有效,或者以错误的方式重复检查子树。有人能引导我吗?

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

  • 我需要检查节点是否是二叉树中的叶子。这是我当前的代码。 它向我发送了一条错误消息:“HW371937.hs:C:\Users\lenovo\Desktop\���\��� HASKELL\hw371937。hs:(22,1)-(25,91):函数isLeaf中的非穷举模式” 我不知道如何递归地检查下一个节点是否是叶子。任何帮助都将受到感谢。

  • 问题内容: 我对二叉树有一些疑问: Wikipedia指出,当“完整的二叉树是其中所有级别(可能除了最后一个级别)均已完全填充且所有节点都位于最左侧”的二叉树时,该二叉树即已 完成 。最后的“越远越好”的段落是什么意思? 如果(1)它是空的,或者(2)它的左右子级是平衡的,并且左树的高度在以下高度的1之内,则格式正确的二叉树被称为“高度平衡”。正确的树,取自如何确定二叉树是否平衡?,这是正确的还是