使用BFT的二叉树的最小深度?

时间:2015-12-28 01:24:11

标签: java algorithm binary-tree breadth-first-search

我试图使用广度优先搜索来计算叶节点的最小深度。我有以下基本结构

public int BFS(Node root){
    if (root == null) return 0;
    Queue<Node> q = new LinkedList<Node>();
    int min = 1;
    q.clear(); // I saw this in a queue example, unsure if needed
    q.add(root);
    while (! q.isEmpty()){
        Node n = q.remove();
        if (n.left != null) q.add(n.left);
        if (n.right != null) q.add(n.right);
    }
 }

我不知道在哪里更新最小高度计数器。我曾考虑过把它放在if语句中作为临时循环变量l&amp;如果左边或右边不为空,我将它们设置为1,否则为0。然后将这两个的最小值加到最小高度,但这只有在我在叶子上方的一个水平处才有效。

3 个答案:

答案 0 :(得分:1)

这个想法应该是这样的:

  • 添加到队列的第一个节点应该有distance = 1
  • 对于添加到队列中的新节点:distance = actual node distance + 1
  • 找到叶子后,返回实际节点距离。 END。

在伪代码中:

root.depth := 1
q := create queue
q.add(root)

while q is not empty
    Node n := q.dequeue()

    if (n is leaf) then
       return n.depth

    if (n.left is not null)  then
       n.left.depth := n.depth + 1
       q.add(n.left)
    if (n.right is not null) then
       n.right.depth := n.depth + 1
       q.add(n.right)

return 0

答案 1 :(得分:1)

您可以使用成对队列(节点,深度)。由于搜索是BFT,因此第一个叶子包含最小深度。

根据你的代码,算法就像那样(伪java代码):

public int BFS(Node root)
{
    if (root == null) 
    return 0;

    Queue<Pair<Node,int>> q = new LinkedList<Pair<Node,int>>();
    q.add(new Pair(root, 0));

    while (! q.isEmpty()) {

        Pair p = q.remove();
        Node n = p.getFirst();

        if (n.left == null && n.right == null) // is this a leaf?
            return p.getSecond(); // yes! ==> p.getSecond() is its min depth

        if (n.left != null) 
            q.add(new Pair(n.left, p.getSecond() + 1));
        if (n.right != null) 
            q.add(new Pair(n.right, p.getSecond() + 1));
    }
}

当然,你需要Pair课程,但我留给你这些细节

答案 2 :(得分:0)

通常在BFS中,您的节点有一个距离字段。根距离为零,然后每当您向队列添加新节点时,将其距离设置为n.distance + 1