所以我需要帮助提出一个表达式,它总是会给我一个二叉树中子节点的父节点的位置。以下是我的老师将参加考试的问题示例:
“考虑一个包含10,000个节点的完整二叉树,使用从索引0开始的数组实现。通过从左到右一次从树中提取元素,按顺序填充数组。假设一个节点有它的值存储在位置4999.该节点的父节点存储的值在哪里?“
我的老师没有告诉我们如何解决这样的问题。她只是说“画一棵二叉树,找到一个模式。”我做到了这一点,但我无法想出任何东西!请帮忙。感谢。
答案 0 :(得分:8)
以下完全使用整数除法。即分数余数被删除。对于任何给定节点索引N
,该节点的子节点将始终位于同一数组中的位置2N+1
和2(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)