【问题标题】:How to check whether a complete binary tree is value-balanced如何检查完全二叉树是否值平衡
【发布时间】:2015-07-23 08:23:54
【问题描述】:

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

【问题讨论】:

    标签: c algorithm data-structures binary-tree


    【解决方案1】:

    您可以对树进行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*) 正在返回一个指向 Node 的指针,表示 参数的左孩子
    • Node getRight(Node*) 正在返回一个指向 Node 的指针,表示 参数的右孩子
    • int getValue(Node*) 正在返回给定节点的值

    这个想法是做一个后序遍历,将左边所有孩子的值相加,得到右边的总和,然后:

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

    【讨论】:

    • 我正在尝试在一维数组中实现它。我正在根据数组中的级别顺序存储完整二叉树的所有节点,例如 3 0 -5 2 2 1 1一个完整的三级二叉树。如何进行后序遍历?
    • 我已经理解了您通过发布订单要说的内容并验证正确性。但是我需要在数组中实现。我怎样才能了解数组中哪些是最低级别的节点值?
    • @i.Beginner:遍历存储在数组中的树是基于以下事实:索引i 的节点的左子节点为(i*2)+1,右子节点为(i*2)+2 .这是假设根位于索引0 并且您有一个完整的二叉树。您知道在计算子节点的索引时已到达叶节点,导致索引大于数组的大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2013-01-23
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多