我似乎遇到了构建广度优先树的问题。
在下面的代码中,我有一个通过另一个类的循环插入的节点。
树的结构应该如此:
A
/ \
B C
/\ /\
D E F G
现在代码:
我的代码正确地构造了左侧,而右侧也添加了左侧。我知道这会发生在代码中的哪个位置,但有没有办法防止这种情况发生?
public Node familyTree;
public void breadthFirst(Node newNode){
familyTree = breadthFirst(familyTree,newNode);
}
public Node breadthFirst(Node T, Node newNode){
if(T == null){
T = newNode;
return T;
}
if(T.left == null){
newNode.height = T.height + 1;
T.left = newNode;
return T;
}
else if(T.right == null){
newNode.height = T.height + 1;
T.right = newNode;
return T;
}
else{
T.left = breadthFirst(T.left, newNode);
T.right = breadthFirst(T.right, newNode); <-- this is the corporate
}
return T;
}
答案 0 :(得分:1)
如果你使用递归,肯定是实现是“深度优先搜索”,对于广度优先搜索,你使用队列或FIFO数据结构
伪代码
public Node breadthFirst(Node T, Node searchNode){
Queue queue = new Queue();
queue.queue(T);
while (!queue.isEmpty()) {
Node curNode = queue.dequeue();
if (curNode == null) continue;
if (curNode.value().equals(searchNode.value()) {
return curNode;
}
queue.queue(curNode.left);
queue.queue(curNode.right);
}
return null; //or throw exception not found
}
答案 1 :(得分:0)
我认为 breadth-first tree
类似于complete binary tree
,因此您可以使用Array
来存储它而不是链接列表。如果父母号码为complete binary tree
,则为n
,left number=2*n+1 right=2*n+2.
例如:使用数组nodes[the amount of node]
而0th Node
是A (number begin zero)
当节点的数量n
为even
时,如C(n=2
),则节点[(n-2)/ 2] .right = nth node
其他odd
喜欢B然后节点[(n-1)/ 2] .left = nth node
答案 2 :(得分:0)
您缺少的是使用左侧和右侧节点的高度来确定当您到达else语句时新节点应该是孩子的哪一侧。目前,无论节点应放在何处,都要将其添加到双方。
顺便说一句,看起来您可能会在高度属性中跟踪树的深度,而不是高度。这篇stackoverflow帖子很好地解释了这些差异。