查找二叉树中父节点的位置

时间:2013-03-20 01:06:33

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

所以我需要帮助提出一个表达式,它总是会给我一个二叉树中子节点的父节点的位置。以下是我的老师将参加考试的问题示例:

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

我的老师没有告诉我们如何解决这样的问题。她只是说“画一棵二叉树,找到一个模式。”我做到了这一点,但我无法想出任何东西!请帮忙。感谢。

5 个答案:

答案 0 :(得分:8)

以下完全使用整数除法。即分数余数被删除。对于任何给定节点索引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 to Parent示例:

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

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

答案 1 :(得分:2)

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

     0
  1     2
3   4 5   6

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

答案 2 :(得分: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)

如果你执行所请求号码的log2(4999)并取整数部分,它将给你最接近2的幂(12)。它是2 ^ 12 = 4096。

4096和2 ^ 13 - 1之间的节点的父节点是2 ^ 11和2 ^ 12 - 1之间的节点。对于第一个节点中的每对节点,您的父节点位于第二节点中。因此,您可以使用差异的一半(4999 - 4096)的整数部分映射它们,并将其添加到父范围start(2048)。

所以你将获得903/2的成绩,并将其加到2048,获得2499。

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

您可以将此算法放在数学表达式中,只需要做一些工作。

希望它有所帮助!

答案 4 :(得分:0)

如果n为偶数,则父节点位于n / 2。 如果n为奇数,则为(n-1)/ 2。 因此,您可以将其记为 math.ceil((n-1)/ 2)