【路飞】_前端算法第五弹-二叉树的深度

129 阅读2分钟

「这是我参与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