image-20210911111741518.png

1.理解题目

所谓二叉树的最大深度,其实就是二叉树的高度。我们要找到从根节点到最远的叶子节点的长度。

2.解题思路

这个题有两种解题思路,一种就是自顶向下,计算每条路径的长度,然后更新最大值,也就是回溯(dfs);另外一种方法就是自底向上,使用后序遍历,往上依次返回当前节点最大深度,其实就是递归的思路,其递推关系就是:Max(左孩子结点的高度, 右孩子结点的高度)+1

2.1.回溯(dfs)

树的最大深度.jpg

回溯就是将每个到叶子节点的路径的长度全部计算出来,然后更新找到最大值。实际上,我在写的时候发现,深度优先遍历二叉树,其实就是二叉树的先序遍历。这就和下面递归的后序遍历对应上了

这里我们的count指代的走过的节点路径的长度,所以刚开始的赋值为0,这主要是为了,让我们写base case的时候更加方便。

  1. int max = 0;
  2. public int maxDepth(TreeNode root) {
  3. backtracking(root, 0);
  4. return max;
  5. }
  6. public void backtracking(TreeNode root, int count){
  7. if(root == null){
  8. max = Math.max(max, count);
  9. return;
  10. }
  11. backtracking(root.left, count+1);
  12. backtracking(root.right, count+1);
  13. }

2.2.递归

树的最大深度_2.jpg

一棵二叉树的高度=Max(左孩子结点的高度, 右孩子结点的高度)+1,根据这个递推关系来写递归函数,首先能确定的是,一定是后序遍历的框架,因为我们要根据两个孩子推出父亲的结果,然后向上一层返回。对于叶子节点来说高度就为1,对于每个节点都选取左右子树高度最大的,返回时加上自己的高度1。

  1. public int maxDepth(TreeNode root) {
  2. if(root == null) return 0;
  3. int leftMaxDepth = maxDepth(root.left);
  4. int rightMaxDepth = maxDepth(root.right);
  5. return Math.max(leftMaxDepth, rightMaxDepth)+1;
  6. }

3.总结

二叉树的高度是一个基础的题目,对这个概念的理解有助于解决后面题目,后面在树的宽度、树的最小深度、平衡二叉树等,都会用到树的高度的概念。