[二叉数] 二叉树的最大深度+N叉树的最大深度

一、题目描述

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

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

返回它的最大深度 3 。


二、思路分析

之前做过一次,其实用的是层次遍历!这次我们用递归的方式! 首先我们理解一句话:前序遍历是深度,后序遍历是深度,深度等于高度! 从这句话可以看出两种解法,一种前序,一种后序! 先说说后序(递归三部曲):

    确定参数和返回值,返回值就是int类型的深度,参数就是子树+深度 终止条件,如果子树为null则返回当前深度 单层逻辑就是,遍历左节点,在遍历右节点,比较大小!

再说说前序(递归三部曲):

    因为先根在左右,所以不能在根就返回值,所以返回值为void,参数还是子树+深度 终止条件就是找到左右子树都是空则结束 先和当前深度和根比较获取最大值,然后在左右子树递归获取最大值!

三、AC代码

后序遍历:

/**
 * 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 {
          
   
    public int maxDepth(TreeNode root) {
          
   
        return getDepth(root, 0);
    }
    public int getDepth(TreeNode root, int depth){
          
   
        if (root == null) return depth;
        int leftDepth = getDepth(root.left, depth + 1);// 左
        int rightDepth = getDepth(root.right, depth + 1);// 右
        return leftDepth > rightDepth ? leftDepth : rightDepth;// 根
    }
}

前序遍历:

/**
 * 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 result = 0;
    public int maxDepth(TreeNode root) {
          
   
        if (root == null)  return result;
        getDepth(root, 1);
        return result;
    }
    
    public void getDepth(TreeNode root, int depth){
          
   
        result = result > depth ? result : depth;// 根

        if (root.left != null){
          
   
            depth++;
            getDepth(root.left, depth);
            depth--;// 恢复到原来的值,要不然求右子树的话会在左子树的基础上求!
        }

        if (root.right != null){
          
   
            depth ++;
            getDepth(root.right, depth);
            depth--;
        }


        
    }
}

四、总结

    深度=高度,深度就是从根到叶子节点,高度就是从叶子到根!

五、巩固练习

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
          
   
    public int maxDepth(Node root) {
          
   
        return getDepth(root, 1);
    }
    public int getDepth(Node root, int depth){
          
   
        if (root == null) return 0;
        int maxDepth = depth;
        for (int i = 0; i < root.children.size(); i++){
          
   
            int tmpDepth = getDepth(root.children.get(i), depth + 1);
            maxDepth = tmpDepth > maxDepth ? tmpDepth : maxDepth;
        }
        return maxDepth;
    }
}

感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤
经验分享 程序员 微信小程序 职场和发展