LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
思路
这题还是可以用递归的方式来解决:
- 首先判读根节点是否存在,不存在直接返回 0
- 定义一个递归函数接收两颗子树和当前深度,返回两颗子树的最大深度
- 当传入的子树都不存在,则返回当前深度
- 定义
num1获取递归左子树的最大深度,左子树不存在则为当前深度 - 定义
num2获取递归右子树的最大深度,右子树不存在则为当前深度 - 最后返回
num1和num2的最大值则为最大深度 - 调用递归函数,传入根节点的左右子树及初始深度
1,返回递归结果
代码实现
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
// 根节点不存在,返回 0
if (!root) return 0
// 定义递归函数,接收两棵树及当前深度
function func(l, r, num) {
// 如果两棵树均为空 返回当前深度
if(!l && !r) return num
// 左子树的最大深度,递归获取,左子树不存在则为当前深度
let num1 = l ? func(l.left, l.right, num + 1) : num
// 右子树的最大深度,递归获取,右子树不存在则为当前深度
let num2 = r ? func(r.left, r.right, num + 1) : num
// 返回左右子树的最大深度
return Math.max(num1, num2)
}
// 传入根节点的左右子树及初始化深度 1,返回递归结果
return func(root.left, root.right, 1)
};
优化
还是递归的思路,但是可以将代码优化一下,不需要接收那么多参数,也不需要额外定义递归函数,可以直接递归当前函数:
var maxDepth = function(root) {
// 当前节点不存在 返回0
if(!root) {
return 0;
} else {
// 递归左子树
const left = maxDepth(root.left);
// 递归右子树
const right = maxDepth(root.right);
// 返回左右子树的最大深度 + 1
return Math.max(left, right) + 1;
}
};