「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
二叉树的深度是一道经典的DFS和BFS算法题。
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
- DFS:深度优先搜索(前序遍历、中序遍历、后序遍历;)
- BFS:广度优先搜索 层序遍历(即按层遍历)
深度优先就是一条路径走到底,再回头走另一条,广度优先就是第一层左右节点全部遍历完,再进入下一层
前序遍历(DFS)
前序遍历就是按根,左,右的的顺序进行遍历,即二叉树从上到下的遍历
var maxDepth = function(root) {
// 先设置一个当前深度,一个最大深度,值都为0
let deep = 0, max = 0;
// 遍历二叉树
dfs(root);
// 返回最大值
return max;
function dfs(root){
// 终止条件
if(!root) return;
当前深度加一
deep++;
判断当前深度与最大深度
if(deep > max) max = deep;
// 遍历左右子节点
dfs(root.left);
dfs(root.right);
// 当前节点遍历完成,回溯到上一个节点,继续遍历
deep--;
}
};
// -----------------------
以上面的二叉树为例
3
/ \
9 20
/ \
15 7
var maxDepth = function(root) {
let deep = 0, max = 0;
dfs(root);
return max;
function dfs(root){
if(!root) return;
deep++;
if(deep > max) max = deep;
dfs(root.left);
dfs(root.right);
deep--;
}
};
第一次进入root!=null,
deep++ = 1
max = deep = 1
进入左节点
9!=null
deep = 2
max = 2
进入左节点
root = null 返回
进入右节点
root = null 返回
deep = 1
进入右节点
root = 20
deep = 2
进入左节点
root = 15
deep = 3
进入左节点
root = null 返回
进入右节点
root = null 返回
deep = 2
deep = 1
deep = 0
return max = 3
后序遍历
后序遍历的顺序是左右根,就是自下至上的遍历
var maxDepth = function(root) {
// 当root不存在的时候,层度为零,每向上一层,层深加一
if(!root) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
// -----------------
以该二叉树为例
3
/ \
9 20
/ \
15 7
math.max((9),(20 +1
math.max(15,7) +1
))+1 // 加一为根节点
=3
层序遍历
层序遍历就是典型的广度优先遍历,一层一层遍历
var maxDepth = function(root) {
if(!root) return 0
// 每一层的所有节点放入queue中
let queue = [root]
// 树层数为res
let res = 0
// 如果queue不为零证明还有未遍历的节点存在
while(queue.length>0){
// 节点暂存
let temp = []
// 循环遍历当前层级的所有节点
for(let i = 0;i<queue.length;i++){
// 如果包含子节点,记录子节点
if(queue[i].left) temp.push(queue[i].left)
if(queue[i].right) temp.push(queue[i].right)
}
// 将所有子节点记录到queue中
queue = temp
// 层级加一
res++
}
return res;
};
// ---------------------------------
以该二叉树为例
3
/ \
9 20
/ \
15 7
queue = [3]
res = 0
queue.length>0
temp = []
temp[9,20]
queue = [9,20]
res = 1
queue.lenmgth>0
temp = []
temp = [15,7]
queue = [15,7]
res = 2
queue.length>0
temp = []
temp = []
queue = []
res = 3
queue.length = 0
return res = 3