温故知新'二叉树的最大深度' 递归和广度优先遍历实现

Posted 旅人与过客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了温故知新'二叉树的最大深度' 递归和广度优先遍历实现相关的知识,希望对你有一定的参考价值。

题目描述

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

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

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

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

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

思路1:广度优先遍历

  • 特殊情况优先考虑:

    • 当root==null; return 0;

  • 否则定义一个队列queue[];用来存储每一层的树节点TreeNode;

    • 根据队列先进先出的特点;

    • 每次遍历都移出对列的首位树节点,并将它的左右子树节点压栈;

    • 当遍历结束后,此时queue队列存储的是下一层的所有树节点;

    • 如示例:root= [3,9,20,null,null,15,7]

    • 此时队列queue=[[3,9,20,null,null,15,7]]

    • 定义levelNum为当前层需要遍历的所有树节点数目:levelNum=queue.length;

    • 通过while(levelNum--)作为条件遍历当前层的所有节点;

    • level++,每一层遍历结束,记录当前遍历树的层级level;

    • 当遍历队列queue为[]时,结束遍历:return level;

  • 示例

//队列queue按层遍历情况;
[ [3,9,20,null,null,15,7] ]
[ [9], [20,15,7] ]
[ [15], [7] ]
[]

代码

javascript
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 * 广度优先遍历
 */
var maxDepth = function(root) {
    if(root==null){
        return 0;
    }
    let level=0,queue=[root];
    while(queue.length){
         let levelNum=queue.length;
         while(levelNum--){
             let currNode=queue.shift();
             if(currNode.left!==null){
                 queue.push(currNode.left);
             }
             if(currNode.right!==null){
                 queue.push(currNode.right);
             }
         }
         level++;
    }
    return level;
};

思路2:递归

  • 特殊情况优先考虑:

    • l和r分别为左子树和右子树的最大高度;

    • 左子树和右子树的最大高度以同样的方式进行计算;

    • 当root==null;return 0;

    • 递归的终止条件为root==null

    • 二叉树的最大深度为:max(l,r)+1;

    • 因此当我们需要计算当前二叉树的最大高度时,可以先递归计算出其左右子树的最大高度;
      示例:

        maxDepth(root.val=3)=1+Math.max(maxDepth(root.val=9),maxDepth(root.val=20));
        maxDepth(root.val=9)=1
        maxDepth(root.val=20)=1+Math.max(maxDepth(root.val=15),maxDepth(root.val=7))
        maxDepth(root.val=15)=1
        maxDepth(root.val=7)=1

调用时从上往下,递归时从下往上;可知:当根节点root==3的高度为3

代码

javascript
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */

/**
 * @param {TreeNode} root
 * @return {number}
 */

var maxDepth = function(root) {
 if(root==null){
     return 0;
 }
 return 1+Math.max(maxDepth(root.left),maxDepth(root.right));
};

经典编程

树:


字符串:




链表:









哈希表:


以上是关于温故知新'二叉树的最大深度' 递归和广度优先遍历实现的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的最大深度 递归

二叉树:看看这些树的最大深度

(二叉树)原来Java 求解二叉树的最大深度如此简单 !!!

104. 二叉树的最大深度

刷题18:二叉树的最大深度

Maximum Depth of Binary Tree-二叉树的最大深度