唯一编号二叉树的节点

时间:2015-08-14 16:38:28

标签: java recursion tree binary-tree

如何在生成二叉树后为每个节点设置索引?

      (a)               (1)
   (x)   (r)   =>     (2)  (3)
  (o)(t)(t)(x)      (4)(5)(6)(7) 

然后,我可以在特定节点使用getIndex()之类的调用来返回其索引。

我的树类:

public class BT<E>{
   E value;
   BT<E> left, right;
   int Index;

   public BT(E value)
   {
      this.value=value;
   }   

   public BT (E value, BT left, BT right) 
   {
      this.value = value;
      this.left = left;
      this.right = right;
   }

3 个答案:

答案 0 :(得分:1)

广度优先遍历。

Queue<BT> queue = new LinkedList<BT>() ;

public void breadth(BT root) {
    if (root == null)
        return;

    queue.clear();
    queue.add(root);
    int index = 0;
    while(!queue.isEmpty()){
        BT node = queue.remove();
        node.Index = index;
        index++;
        if(node.left != null) queue.add(node.left);
        if(node.right != null) queue.add(node.right);
    }

}

改编自here

答案 1 :(得分:0)

所以你要实现一个程序getIndex(int index),它必须返回带有该索引的节点?

如果是这样,您正在寻找一种表示二叉树的有效方法。 您可以在每次拨打getIndex时遍历树,但这不会有效......

有效的解决方案是将完整二叉树存储在数组中,因为它提供了O(1)访问权限。将节点n存储在数组中的索引n处,并将其子节点存储在索引2*n(2*n) - 1处。但是这里的限制是树必须完整并且数组的大小不可变(如果二叉树变得太大,则应该制作更大的数组(通常是两倍大)并且应该复制所有元素)。

这是一个方便的解决方案,因为:

  • 节点访问位于O(1)中,但addNode()之类的过程将在O(1)中变为摊销。的(*)
  • 节点不必记住它的子节点 - &gt; this.left变为this.left(),并在下面提供了left()

left()程序的可能实施。

static int[] binaryTreeArray = new int[maxTreeSize]; // BT of integers for example
...
public int left() { // returns integer or ... (type of your nodes)
    return binaryTreeArray[(this.Index)*2]; // O(1)
}

(*)类似addNode()的过程会在大多数情况下在O(1)(binaryTreeArray[index] = nodeValue;)中添加节点,但binaryTreeArray是它必须制作一个通常两倍大的更大的数组(复制为O(n))。可以证明,这具有O(1)的摊销成本,但这对此答案没有任何附加价值。

答案 2 :(得分:0)

如果在完全创建树之后执行此操作,则使用级别顺序遍历的内容将起作用。它不是非常有效,但是它是直接的递归:

/* Method to set index based on level-order traversal of tree */
public void initIndices(BT root) {
    int maxIndexSoFar = 0;
    for (int d = 1; d <= root.height(); ++d)
        maxIndexSoFar = setIndexAtLevel(root, d, maxIndexSoFar);
}

/* Method to set index of all nodes at a given level */
private int setIndexAtLevel(BT node, int level, int index) {
    if (tree == null)
        return index;
    if (level == 1) {
        index++;
        node.setIndex(index);
        return index;
    }
    else if (level > 1) {
        int newIndex = setIndexAtLevel(node.left, level-1, index);
        newIndex = setIndexAtLevel(node.right, level-1, newIndex);
        return newIndex;
    }
    return -1;
}

我将让您创建height()方法和setIndex()方法。公平的警告,我根本没有测试过,所以原谅任何错别字。