二叉树的概念:树中每个节点最多只能有两个子节点。
树的一些常用操作,深度优先遍历DFS、广度(宽度)优先遍历BFS,二叉树的先、中、后序遍历。
题目描述
思路
这道题要求找出数的最大深度,优先考虑使用DFS,DFS可以对根节点以及根结点的children进行深度查找,在查找的过程中,记录每个节点的层级,找到最大的即可。
时间复杂度为 O(n),n为整棵树的节点树,因为每个节点都遍历到;
空间复杂度为 O(n),n为最大深度。
为什么空间复杂度是O(n),而不是O(1)呢?
因为code中存在函数里面调用函数,会形成调用堆栈,递归也是,函数没有执行完之前,内存一直存在。树的嵌套层数等于最大深度,二叉树的最大深度和树的节点数的关系可以表示为:
最坏的情况O(n),最大深度等于节点数,二叉树不分成两个叉,只在一个叉上不断延续;
最好的情况O(logN),每个叉都分为二叉,均匀分布。
步骤
- 新建变量,记录最大深度;
- 深度优先遍历整棵树,并记录每个节点的层级,同时刷新最大深度;
- 遍历结束返回最大深度;
Code part
var maxDepth = function(root) {
let res = 0;
const dfs = (n,l) => {
if(!n) return;
if(!n.left && !n.right){ //在叶子节点取l,避免每次递归都执行Math.max
res = Math.max(res,l);
}
dfs(n.left,l+1) //注意这里是l + 1,不是l++
dfs(n.right,l+1)
}
dfs(root,1)
return res
};
需要注意的是,在递归遍历时,层级传参是 l+1,不是 l++,因为是把整个 l+1 作为参数传入的,不是传参 l。