广度优先树

时间:2016-11-13 00:59:28

标签: java nodes breadth-first-search

我似乎遇到了构建广度优先树的问题。

在下面的代码中,我有一个通过另一个类的循环插入的节点。

树的结构应该如此:

    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;

}

3 个答案:

答案 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,则为nleft number=2*n+1 right=2*n+2.

例如:使用数组nodes[the amount of node]0th Node是A (number begin zero) 当节点的数量neven时,如C(n=2),则节点[(n-2)/ 2] .right = nth node 其他odd 喜欢B然后节点[(n-1)/ 2] .left = nth node

答案 2 :(得分:0)

您缺少的是使用左侧和右侧节点的高度来确定当您到达else语句时新节点应该是孩子的哪一侧。目前,无论节点应放在何处,都要将其添加到双方。

顺便说一句,看起来您可能会在高度属性中跟踪树的深度,而不是高度。这篇stackoverflow帖子很好地解释了这些差异。