【问题标题】:Complete AND Full Binary tree max and min indexes?完整和完整的二叉树最大和最小索引?
【发布时间】:2017-05-08 14:00:27
【问题描述】:

我不确定我是否想多了,但我想不出一般情况下的解决方案:(

【问题讨论】:

  • 考虑到二叉搜索树是一个排序树,其中每个左节点小于其父节点,每个右节点大于其父节点,可以肯定地说最小值是远左边,最大的值是最右边。

标签: java arrays data-structures binary-tree


【解决方案1】:

只要我们为任何节点存储在右子树中具有较大值的节点和在左子树中存储较小值的节点,Bottom Right 角处的节点将具有最大值,Bottom Left 角处的节点将具有最小值。

所以现在你需要找到节点。假设树是Complete and Full BST,并且它存储在数组中,因此索引均匀分布在节点上。所以这里我们需要移动Top to BottomLeft to Right,如果有n节点,则将索引分配给从1开始的节点到n

所以如果我们为给定的树写索引,

                            1
                         /     \
                        2       3
                      /   \   /   \
                     4     5 6     7
                    / \           ^^^-------------Largest value
                   8   9
Smallest value----^^^

因此,此处具有8 索引的节点将具有最小值,而具有7 索引的节点将具有最大值。

所以现在的问题是如何找到它。所以考虑我们有一个级别为l 的树,那么最大值的索引将是2^level - 1,最小值将在2^levelth 索引。但是我们在这里得到的最大值索引可能会给我们一个错误的答案如果total_nodes = 2^level-1。所以我们需要考虑total_nodes = n+1,以不同的方式计算level

int level = (int)(Math.ceil ( Math.log(n)/Math.log(2) ));    //For index of smallest value;
int smallest_index = (int) Math.pow (2,level);

level = (int)(Math.ceil ( Math.log(n+1)/Math.log(2) ));    //For index of largest value;
int largest_index = (int) Math.pow (2,level) - 1;

【讨论】:

    【解决方案2】:

    Sanket 的回答基本上是对的,但最终陈述的方式让我感到不舒服。谁说两个四舍五入(!)日志的四舍五入(!)比率不会四舍五入到只是略高于预期的整数?然后ceil 将一路向上。也许它有效,但它本质上是偶然的,而不是设计的。

    就按位算术而言,它也可以“干净地”表述,而无需考虑/担心这些事情。一切都是整数,因此更容易推理。

    最低项的索引是n中存在的2的最高幂,因此最高设置位。在 Java 中甚至有一个函数:Integer.highestOneBit,或者我们可以写它:

    int highestOneBit(int x) {
        x |= x >> 16;
        x |= x >> 8;
        x |= x >> 4;
        x |= x >> 2;
        x |= x >> 1;
        return x ^ (x >>> 1);
    }
    

    现在我们有了

    indexOfLowest = highestOneBit(n);
    indexOfHighest = highestOneBit(n + 1) - 1;
    

    这仍然假设基于 1 的索引(保留索引 0 未使用),您可以简单地将其全部偏移 1 以使其索引为 0。

    【讨论】:

    • 这是获得关卡的完美方法,因为对于较大的值Math.ceil()Math.log() 可能会给出不一致的结果,因此最好使用按位运算来确保正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2018-06-29
    • 2012-11-28
    • 2022-11-15
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多