如何在生成二叉树后为每个节点设置索引?
(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;
}
答案 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
处。但是这里的限制是树必须完整并且数组的大小不可变(如果二叉树变得太大,则应该制作更大的数组(通常是两倍大)并且应该复制所有元素)。
这是一个方便的解决方案,因为:
addNode()
之类的过程将在O(1)中变为摊销。的(*)强> 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()
方法。公平的警告,我根本没有测试过,所以原谅任何错别字。