在数组中存储二叉树

时间:2014-12-24 20:10:43

标签: java algorithm binary-search-tree

假设有一个像下面那个需要存储在数组中的二叉树。

    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

2 个答案:

答案 0 :(得分:3)

这种用于在树中存储二叉树的算法是为树设计的,这样树的每个分支从根节点开始具有相同的长度:数组大小基于树内的最大深度,然后它为每个相等或较小深度的树位置指定一个数组位置。如果您有许多不同的分支长度,这可能不适合您。如果你的分支长度大多是相同的深度,但有时在树的末端是空的,那么放置一个'null'值,如-1Integer.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比当前节点大。如果在左侧或右侧遇到较高值意味着终点节点。