【问题标题】:Finding the location of a parent node in a binary tree在二叉树中查找父节点的位置
【发布时间】:2013-03-20 01:06:32
【问题描述】:

所以我需要帮助想出一个表达式,该表达式将始终为我提供子节点在二叉树中的父节点的位置。以下是我的老师将在我们的考试中提出的问题示例:

“考虑一棵完全有 10,000 个节点的二叉树,用一个从索引 0 开始的数组来实现。数组是通过从树中从左到右一次一层提取元素来按顺序填充的。假设一个节点有它的值存储在位置 4999。该节点的父节点的值存储在哪里?"

我的老师没有告诉我们如何解决这样的问题。她只是说“画一棵二叉树并找到一个模式”。我就是这么做的,但我什么也想不出来!请帮忙。谢谢。

【问题讨论】:

  • 您应该准确地写出您尝试过的内容。某处可能有一个简单的错误。
  • 按照说明,这个问题是不可能的。你一定有误解或记错了。我可以立即想到 4998 和 5000 都是答案。
  • 没有。给我任何孩子父母位置的表达式将采用“2^(n+1) - 1”或类似的形式。然后输入子节点的位置(在本例中为 4999),表达式应该为您提供父节点的位置。
  • 我真的不需要知道如何解决这个问题。我需要更多的策略来找到像上面那样的算法或方程,它会给我父节点的位置。她说她会给我们一个实现为数组的二叉树。二叉树的根可以从数组的索引 0 或 99 开始。我的工作是找到一个方程,这样当您插入子节点的位置时,它将产生父节点的位置。我希望我在这里有意义
  • @MooingDuck:真的吗?第 k 行有 2^k 个元素,所以我们可以将 4999 映射回树位置,获取父节点的树位置,然后将其映射回数组索引,确定吗?为什么结果会有歧义?

标签: c++ tree binary-tree parent-child uncertainty


【解决方案1】:

以下完全使用整数除法。 IE。小数余数被丢弃。对于任何给定的节点索引N,该节点的子节点将始终位于同一数组中的2N+12(N+1) 位置。

因此,此类数组中任何节点N > 0 的父节点将始终位于索引(N-1)/2

父母对孩子的例子:

Parent 0: children 1,2
Parent 1: children 3,4
Parent 2: children 5,6
Parent 3: children 7,8
etc...

孩子到父母的例子:

Child 8 : Parent = (8-1)/2 = 7/2 = 3
Child 7 : Parent = (7-1)/2 = 6/2 = 3
Child 6 : Parent = (6-1)/2 = 5/2 = 2
Child 5 : Parent = (5-1)/2 = 4/2 = 2

所以对于你的问题:

(4999-1)/2 = 4998/2 = 2499

注意:记住这一点,因为当您开始编写基于数组的堆排序算法时,您将广泛地使用它

【讨论】:

  • @AndreMiranda 排序与此无关。这是存储在数组中的二叉树。时期。为该存储选择的顺序无关紧要;问题是,给定所述数组中的子节点索引,您将在什么索引处找到父节点。就是这样。
【解决方案2】:

感谢大家的帮助。我找到了我的问题的答案!

寻找父节点位置的通用算法是:

[i + (root - 1)] / 2 其中 i 是给定节点的位置,root 是根的位置。所以在上面给定的问题中,根从位置 0 开始。所以找到任何节点的父节点的方程是 [i + (0 - 1)] / 2 = (i - 1) / 2

现在假设根从位置 3 开始,那么等式将是 [i + (3 - 1)] / 2 = (i + 2) / 2!!!!这是我需要的算法。你们中的大多数人帮助我解决了我提供的一个问题,但我实际上需要一个二叉树的通用解决方案,它的根可以从任何位置开始;不只是零

【讨论】:

    【解决方案3】:

    这似乎是数组元素根据数组索引映射回树的方式

         0
      1     2
    3   4 5   6
    

    如果是,则索引n 的父级位于floor( (n - 1) / 2 )(对于n != 0

    【讨论】:

      【解决方案4】:

      如果您对请求的数字 (4999) 进行 log2 并取整数部分,它将为您提供最接近数字 (12) 的二的幂。它是 2^12 = 4096。

      4096 和 2^13 - 1 之间的节点的父节点是 2^11 和 2^12 - 1 之间的节点。对于第一个范围内的每一对节点,您在第二个范围内都有其父节点。因此,您可以将它们映射为差值一半的整数部分 (4999 - 4096),并将其添加到父范围开始 (2048)。

      所以你将有 903 / 2 的楼层,并将其添加到 2048,得到 2499。

      注意,我没有做精确的计算,取答案的策略而不是结果。

      你可以把这个算法放在一个数学表达式中,只需一点点工作。

      希望对你有帮助!

      【讨论】:

      • 好。你得到了正确的答案,所以你知道我在这里问什么。现在我只需要仔细阅读您所说的并尝试了解您的策略大声笑。感谢您的回复。
      • @nico 虽然你的答案是 100% 正确的,(策略,我没有检查边缘情况),有一个 very 简单的等式应该给出相同的答案.
      【解决方案5】:

      如果 n 为偶数,则父节点位于 n/2。 如果 n 为奇数,则为 (n-1)/2。 所以你可以记住它为 ma​​th.ceil((n-1)/2)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多