【LeetCode力扣】104.二叉树的最大深度(另一种dfs)(Java)

文章目录

  • 一、题目
  • 二、解题
    • 1.思路
      • 官方dfs
      • 另一种dfs
    • 2.代码
    • 3.复杂度分析


一、题目

二叉树的最大深度简单

给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]

  3
 / \
9   20
    / \  
   15  7

返回它的最大深度 3 。

二、解题

1.思路

dfs

官方dfs

这题一般想到的思路就是深搜依次遍历左右结点,然后返回int相加,然后在返回值取Math.max()
以下是力扣官方的dfs代码:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int leftHeight = maxDepth(root.left);
            int rightHeight = maxDepth(root.right);
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
}

代码简洁,不好理解

  • 时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。
  • 空间复杂度:O(height),其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

另一种dfs

这个题还可以有另一种dfs,就是计算层数
假如有如下一棵二叉树:
【LeetCode力扣】104.二叉树的最大深度(另一种dfs)(Java)_第1张图片
可以看出最远叶子节点为“J”,即二叉树的最大深度为:5

  • 这里我们可以把根节点“A”所在的层数看做第 1 层
  • “B”、“C”节点所在的层数看做第 2 层,
  • 以此类推,直到最深的叶子节点看做最后一层。

可以发现“J”节点所在的层数为:5,所以我们只用算二叉树的“层数”,即二叉树的最大深度

相同思路也可以解1302. 层数最深叶子节点的和
1302解:leetcode1302. 层数最深叶子节点的和(Java)

2.代码

/**
 * 二叉树的定义
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int maxLevel = 0;//最大层数
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        findMaxDepth(root,1);
        return maxLevel;
    }

    //int level当前层数
    public void findMaxDepth(TreeNode root,int level){
        if(root == null){
            return;
        }
        if(maxLevel <= level){
            maxLevel = level;
        }

        findMaxDepth(root.left,level + 1);
        findMaxDepth(root.right,level + 1);
    }
}

3.复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树的节点数。深度优先搜索需要遍历每个节点一次。
  • 空间复杂度:O(n),其中 n 是二叉树的节点数。空间复杂度主要取决于递归调用栈的深度,为二叉树的深度,最坏情况下二叉树的深度是 O(n)。

你可能感兴趣的:(LeetCode,深度优先,leetcode,java)