本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
题目解析
思路一
我们新建一个变量用于存放记录的最大深度,然后声明一个递归函数,第一个参数是数据,第二个参数代表着每一个节点的层级,递归函数中进行判断,如果当前数据不存在则直接返回,如果存在则只在叶子节点刷新最大深度变量并减少计算次数,在进行调用递归函数,最后在返回记录的最大深度
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function (root) {
let res = 0;
const dns = (n, i) => {
if (!n) return;
if (!n.left && !n.right) res = Math.max(res, i);
dns(n.left, i + 1);
dns(n.right, i + 1);
};
dns(root, 1);
return res;
};
思路二
首先,我们先判断节点是否为空,为空则返回0。然后,我们用递归,求父节点所在子树的深度就是求左右两个字数深度的最大值加1,也就是max(左子树的深度+右子树的深度)+1。最后我们通过递归可以找出根节点左右子树的深度,然后找到最大值加1即整个树的深度进行返回
/**
* @param {TreeNode} root
* @return {number}
*/
var maxDepth = function(root) {
if(root===null){
return 0;
}else{
let l = maxDepth(root.left);
let r = maxDepth(root.right);
return Math.max(l,r)+1;
}
};
思路三
使用循环进行遍历,先做一下边界判断,在声明一个使用队列,声明一个变量用于记录层数,进行循环,队列的长度每次都会变,所以需要记录下层数,然后再根据当前队列的长度进行循环,因为当前当前队列的长度多少就表示这一层有多少个节点,循环结束,表示当前层遍历完毕,level加一层,最终返回即可
var maxDepth = function(root) {
if(!root) return 0
let queue = [root]
let level = 0
while(queue.length) {
let len = queue.length
for(let i = 0; i < len; i++) {
let node = queue.shift()
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
level++
}
return level
};