我需要帮助设计一个表达式,它能始终给出二叉树中子节点的父节点位置。以下是我的老师在考试中会出的问题示例:“考虑一个完整的二叉树,有10000个节点,用从索引0开始的数组实现。该数组按顺序从左到右从每个层级上抽取元素来填充树。假设一个节点的值存储在位置4999。那么这个节点的父节点存储在哪里?” 我的老师并没有告诉我们如何解决这样的问题。她只说“画一个二叉树并找到一种模式。”我已经这样做了,但是仍然无法得出任何结论!请帮帮我,谢谢!
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
注意:记住这一点,因为当你开始编写基于数组的堆排序算法时,你将广泛地使用它。
感谢大家的帮助。我已经找到了我的问题的答案!
查找父节点位置的通用算法为:
[i + (root - 1)] / 2,其中i是给定节点的位置,root是根节点的位置。因此,在上述给定问题中,根从位置0开始。所以找到任何节点的父节点的方程式为[i + (0 - 1)] / 2 = (i-1) / 2。
现在假设根节点从位置3开始,则方程式为[i + (3 - 1)] / 2 = (i + 2) / 2!!!这就是我需要的算法。你们中的大多数人都帮助我解决了一个问题,但实际上我需要的是二叉树的通用解决方案,其根可以从任何位置开始,而不仅仅是从零开始。
看起来这就是数组元素如何根据数组索引映射回树的方式。
0
1 2
3 4 5 6
n
的父节点位于floor((n-1)/2)
(对于n != 0
)。