文章目录
- 二叉树的最大深度
- 我的思路
- 网上思路
- 总结
二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
图一:
示例 1:(如图一)
输入:root = [3,9,20,null,null,15,7]
输出:3示例 2:
输入:root = [1,null,2]
输出:2
我的思路
循环
网上思路
递归
我的思路
var maxDepth = function (root) {if (!root) return 0;const queue = [root];let depth = 0;while (queue.length > 0) {depth++;const levelSize = queue.length;for (let i = 0; i < levelSize; i++) {const node = queue.shift();if (node.left) queue.push(node.left);if (node.right) queue.push(node.right);}}return depth;
};
讲解
- 检查根节点: 如果根节点为空(即树是空的),则返回深度 0。这是基本情况。
- 初始化队列和深度:
- 创建一个队列(使用数组实现),并将根节点添加到队列中。
- 初始化深度变量 depth 为 0,用于记录当前的深度。
- 开始层次遍历:
- 使用 while 循环遍历队列,直到队列为空。这表示我们还没有遍历完所有层级的节点。
- 每次进入 while 循环时,表示我们进入了下一层,因此将深度加 1
- levelSize 变量记录当前队列的长度,即当前层的节点数量。我们将在这个范围内遍历当前层的所有节点。
- 遍历当前层的节点:
- 使用 for 循环遍历当前层的所有节点。queue.shift() 从队列中移除并返回第一个节点,赋值给 node。
- 检查当前节点 node 是否有左子节点,如果有,则将其添加到队列中。
- 同样检查右子节点,并将其添加到队列中。
- 返回最大深度
网上思路
var maxDepth = (root) => {if (!root) return 0; // 如果节点为空,深度为0return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; // 返回左子树和右子树的最大深度加1
}
讲解
- 使用 Math.max 函数计算左子树和右子树的最大深度。
- 递归调用 maxDepth(root.left) 和 maxDepth(root.right) 分别计算左子树和右子树的深度。
- 最后加 1 表示当前节点本身。
总结
我怎么就没想到使用递归呢?