使用队列的树的最大深度

时间:2016-01-09 07:15:37

标签: java algorithm data-structures tree binary-tree

在Narasimha Karumanchi所着的“数据结构与算法”一书中, 这是用于查找树的最大深度的代码。

由于某种原因,他向队列提供null。我不懂为什么。删除它会破坏代码。

我想知道为什么作者正在添加null以及是否可以通过这种方式解决问题,因为我们可以在不添加null的情况下解决同样的问题。

源代码:

public class MaxDepthInBinaryTreeWithLevelOrder {
// Returns the depth of this binary tree. The depth of a binary tree is the
// length of the longest path from this node to a leaf. The depth of a
// binary tree with no descendants (that is, just a leaf) is zero.
public int maxDepthLevelOrder(BinaryTreeNode root){
    if(root == null)
        return 0;
    int maxDepth = 1;
    Queue<BinaryTreeNode> q = new LinkedList<BinaryTreeNode>();
    q.offer(root);
    q.offer(null);   //  <----------- 'NULL' added Here
    while(!q.isEmpty()){
        BinaryTreeNode tmp = q.poll();
        if(tmp != null){
            if(tmp.getLeft() != null)
                q.offer(tmp.getLeft());
            if(tmp.right != null)
                q.offer(tmp.right);
        }else{
            if(!q.isEmpty()){
                ++maxDepth;
                q.offer(null); //  <--------- Here
            }
        }
    }
    return maxDepth;
 }
}

2 个答案:

答案 0 :(得分:5)

null用于标记关卡的结尾。

作者正在使用级别顺序遍历来查找树的深度。他使用Queue数据结构来实现它。为了划分彼此相邻的水平,null用作水平标记。

例如。他首先插入root,然后是null标记。在while循环第一次迭代中,队列中的第一个元素被移除,如果不为null,它的左右子节点将被添加到队列中。当删除下一个元素时,它将为null,表示级别1的结束。现在,如果队列不为空,则可能有许多其他级别。因此再次插入空标记。

注意: - 只要null从队列中删除元素,就意味着当前级别中没有更多元素,并且下一级别的所有子级都将添加到队列中,并且不再有下一级别的元素。所以我们可以再次插入空标记来标记下一级的结束。

答案 1 :(得分:0)

当队列首先在呼吸中遍历二进制搜索时,即覆盖所有处于相同深度水平的元素,然后移动到下一个深度级别。

将所有元素(以相同的深度级别存在)添加到队列后,

null 将添加到队列中。

从队列中删除 null 表示我们已经成功遍历了相同深度级别的所有元素以及我们增加maxDepth计数器的原因。

null可以看作是一个标志,让算法知道我们已经覆盖了所有存在于相同深度级别的元素。