繁体   English   中英

使用队列的树的最大深度

[英]Maximum depth of a tree, using a queue

在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;
 }
}

null用于标记关卡的结束。

作者正在使用级别顺序遍历来查找树的深度。 他使用队列数据结构来实现它。 为了彼此相邻地划分等级,将空值用作等级标记。

例如。 他首先插入根,然后插入空标记。 在while循环的第一次迭代中,队列中的第一个元素被删除,并且它的左右子元素(如果不为null的话)被添加到队列中。 当删除下一个元素时,它将为空,表示级别1的末尾。现在,如果队列不为空,则可能会有许多其他级别。 因此,再次插入了空标记。

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

当“队列”以“呼吸”方式遍历二进制搜索时,即覆盖所有处于相同深度级别的元素,然后继续进入下一个深度级别。

在将所有元素(存在于相同深度级别)添加到队列之后,将null添加到队列。

从队列中删除null表示我们已经成功遍历了所有深度相同的元素,这就是为什么要增加maxDepth计数器的原因。

可以将null视为标志,以使算法知道是的,我们已经覆盖了存在于相同深度级别的所有元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM