「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。
题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例1
3
/ \
9 20
/ \
15 7
输入:[3,9,20,null,null,15,7],
输出:3
思路
题目考的是最基本的二叉树的遍历,对于这类型的题目,递归求解是最通用的解法;
定义一个函数 dfs(root, level)
,接收一个节点 root
和当前的层级 level
-
判断当前节点是否存在,不存在就结束递归
-
用
level
和全局maxLevel
取最大值 -
继续递归节点的左右节点,把
level + 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)
* }
*/
var maxDepth = function(root) {
let maxLevel = 0;
const dfs = (root, level) => {
if(!root) return;
maxLevel = Math.max(maxLevel, level);
// 递归遍历
dfs(root.left, level + 1);
dfs(root.right, level + 1);
}
dfs(root, 1);
return maxLevel;
};
思考: 上面的递归,是 深度优先遍历
的算法,即每找一个节点时,就继续遍历它的子树,直到子树为空,然后再依次往回找兄弟节点,再找兄弟节点的子树,直到整棵树遍历完成
但还有一种 广度优先遍历
算法,优先遍历兄弟节点,再遍历子节点;但通常广度优化,需要额外维护一个栈 stack
广度优先遍历完整代码
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
let max = 0;
if(!root) return max;
const stack = [];
stack.push(root);
while(stack.length != 0) {
const currentStackLength = stack.length;
// 每一次 while 遍历,都是一层
max++;
for(let i = 0; i < currentStackLength; i++) {
// 出栈
const node = stack.shift();
// 入栈
if(node.left) stack.push(node.left);
if(node.right) stack.push(node.right);
}
}
return max;
};
小结
简答题就快速做,把可能的解法都快速的过一遍,检验自己是不是真正的掌握了对应的解法。
LeetCode 👉 HOT 100 👉 二叉树的最大深度 - 简单题 ✅
合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍
如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄