这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战
题目描述
给你一个二叉树,需要你找出这个二叉树的最大深度。
最大深度是指从根节点到最远的叶子节点(也就是没有左右子节点的节点),经过了几层。
举个例子:(手工画图,凑合着看)
这个二叉树的最大深度是 2(如1->2)
这个二叉树的最大深度是 3(如1->2->4)
这个二叉树的最大深度是 4(如1->3->5->7)
思路分析
第一种方法(递归)
我们可以使用递归的方法去遍历二叉树,首先是根节点是第一层。
根节点的左边树,右边树是第二层。以此类推。
具体的实现是:
我们可以先定义个变量maxLevel, 代表的是二叉树最大层级。
然后定义个find函数,接受2个参数,一个是节点,一个是当前的层级。
如果没有节点,则直接返回。继续遍历。
需要注意的是,同一层的二叉树只需要加一次,不用每个都加,所以这里有个判断,
如果二叉树最大层级小于等于当前的层级,则最大层级才加一。否则不处理。
然后继续遍历节点的左边数和节点的右边树。层级的参数为当前的层级加一传入。
遍历到最后,maxLevel就是最大的层级。
返回即可。
/**
* 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) {
let maxLevel = 0
function find (root, level) {
if (!root) return
if(maxLevel <= level) maxLevel = level + 1
find(root.left, level + 1)
find(root.right, level + 1)
}
find(root, maxLevel)
return maxLevel
};
第二种方法(递归)
跟第一种方法类似,也是递归,但是它是使用了Math.max方法。对节点的左边树和右边树递归调用,每次递归调用的时候用Math.max的法取最大值,然后加一,代表当前节点的最大层级。
这样递归调用结束的时候,最终得到的是最大的层级,也就是二叉树的最大深度。
返回即可。
代码如下:
/**
* 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) {
if (!root) return
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1
};