非递归方法求解二叉树最大深度

题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7


返回它的最大深度 3 。

分析

使用递归,很容易写出该求解算法,思路也简单,就是左子树和右子树高度,取两者最大,然后在此基础上加1即可,如下图所示,差不多1到2行代码。

   public int maxDepth(TreeNode root) {
        return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }

然而,递归使用不当,会有风险,毕竟递归栈的深度非常有限,假如一棵接近线性化的二叉树,也就是严重一侧倾斜,退化成接近一个单链表

   5
  / \
 1   2
     \
       3
      /
     5
     \
      6
      \
       8
 ......

当二叉树的深度高达数千甚至上万的时候,使用递归,那是一定会栈溢出的!因此,在栈深度较深乃至于不可控时,我们需要另想办法,取代递归。

 

解决方案

我们可以采用层次遍历的方式,遍历完一层,我们就将深度加1,直到遍历完二叉树的所有层后,深度自然也就出来了。这个思路的实现,很明显可以使用迭代的方式。下面的是代码

 public static int maxDepth2(TreeNode root) {
        if (root == null) return 0;

        Queue queue = new LinkedList<>();
        queue.offer(root);
        int depth = 0;
        while (!queue.isEmpty()){
            //得到这一层的node个数
            int levelNodeSize = queue.size();
            //取完这一层,并下一层的node也就全部放进去
            while (levelNodeSize > 0){
                TreeNode node = queue.poll();
                if(node.left != null)
                    queue.offer(node.left);
                if(node.right != null){
                    queue.offer(node.right);
                }
                levelNodeSize--;
            }
            depth++;
        }
        return depth;

    }

你可能感兴趣的:(数据结构与算法,二叉树)