假设有一个像下面那个需要存储在数组中的二叉树。
7
/ \
1 10
/\
9 11
我发现在数组中存储节点的公式从将根节点存储在位置0开始,然后对于索引为i
的每个节点,其子节点位于索引(i*2)+1 and (i*2)+2
。如果任一子项的索引大于array.length - 1
,那么该节点就没有子项。
所以我首先将7放在位置0,然后将其子1和10放在位置i2 + 1和i2 + 2位置为1和2:
|7|1|10| | | |
0 1 2 3 4 5
现在,我遇到了没有任何孩子的节点1。我该怎么把它作为孩子?
是否可以设置一些表示缺少节点的默认值,例如-1,如下所示:
|7|1|10|-1|-1|9|11|
0 1 2 3 4 5 6 7
答案 0 :(得分:3)
这种用于在树中存储二叉树的算法是为树设计的,这样树的每个分支从根节点开始具有相同的长度:数组大小基于树内的最大深度,然后它为每个相等或较小深度的树位置指定一个数组位置。如果您有许多不同的分支长度,这可能不适合您。如果你的分支长度大多是相同的深度,但有时在树的末端是空的,那么放置一个'null'值,如-1
或Integer.MIN_VALUE
可能是一个合适的解决方案,只要你知道您通常不需要将任何-1值放入树中。
如果您碰巧知道您只会丢失树的最深层次的元素(如您提供的示例中所示),并且树的左/右顺序无关紧要,您可以简单地重新排序您的树,使得空值始终位于最下面的最右侧位置,这也是数组末尾的位置集,从而使您的树成为complete binary tree。然后,您只需要记住树中元素的数量,该元素的数量大于最后一个非空值的索引。图解:
7
/ \
10 1
/\
9 11
-->
|7|10|1|9|11|0|0|
0 1 2 3 4 5 6
length = 5 or lastIndex = 4
答案 1 :(得分:0)
我在考虑使用会破坏二叉树属性的值。在一般二叉树中,Left总是较小,right比当前节点大。如果在左侧或右侧遇到较高值意味着终点节点。