c - 如何判断一棵完全二叉树是否值平衡

标签 c algorithm data-structures binary-tree

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

最佳答案

你可以做一个post order traversal对每个子树求和,然后返回到(每个子树的)根,评估两个子树是否具有相同的权重。

类 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);
}

在哪里

  • Node getLeft(Node*) 正在返回一个指向表示 参数的左 child
  • Node getRight(Node*) 正在返回一个指向表示 论点的右 child
  • int getValue(Node*) 正在返回给定节点的值

这个想法是做一个后序遍历,对左边所有 child 的值求和,对右边求和,然后:

  1. 验证正确性——如果不是,则整棵树的答案是否定的,并将其设置在res中。
  2. 将两个和+当前节点相加,返回给parent。

关于c - 如何判断一棵完全二叉树是否值平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191260/

相关文章:

c - 理解C中的字符数组

Java,位 vector

algorithm - 对具有交替元素排序和反向排序的链表进行排序

java - 如何使用 trie 设计字典应用程序?

c程序在/etc/rsyslog.d/中创建conf文件

c - GCC 的 NetBeans 设置

c - For 循环卡在 C (cygwin) 中的函数调用中,非常奇怪的行为我无法理解

mysql - #1067 - DATETIME 'add_time' 的默认值无效

c++ - 十次幂的乘法算法

database - DBMS 中使用的数据结构