104. 二叉树的最大深度

问题描述

  • 给定一个二叉树,找出其最大深度。
  • 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
  • 说明: 叶子节点是指没有子节点的节点。
示例1:
输入:给定二叉树 [3,9,20,null,null,15,7]
    3
   / \
  9  20
    /  \
   15   7
输出:返回它的最大深度 3 。

题目来源:LeetCode官方
链接地址:https://leetcode.cn/problems/maximum-depth-of-binary-tree/

思路

直接递归遍历,分别获取左子树深度与右子树深度,返回较大的变量即可

核心代码

    public static int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
        //这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
        //return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
        //这个写法就只递归了两次,节省了时间
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return left > right ? left + 1 : right + 1;
    }

代码解释

分别获取左子树高度,与右子树高度,然后返回最大的,递归的理解就是将整个二叉树看成三个部分:根结点、左结点、右结点,然后根据题目意思对这三部分做相应处理

运行效果

无

完整源代码

package com.easy;

public class maxDepth {
    public static void main(String[] args) {
        /**
         * 构建二叉树
         *      1
         *   2    3
         *  4 5  6
         */
        TreeNode n4 = new TreeNode(4);
        TreeNode n5 = new TreeNode(5);
        TreeNode n6 = new TreeNode(6);
        TreeNode n2 = new TreeNode(2, n4, n5);
        TreeNode n3 = new TreeNode(3, n6, null);
        TreeNode root = new TreeNode(1, n2, n3);

        System.out.println(maxDepth(root));
        System.out.println(count_deep(root));

    }

    //DFS
    public static int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //灵魂在于maxDepth函数return语句的+1,有了它,在遍历二叉树的时候层数才会不断叠加
        //这种写法会超时,因为相当于要递归四次(每一个递归函数相当于一次)
        //return maxDepth(root.left) > maxDepth(root.right) ? maxDepth(root.left) + 1 : maxDepth(root.right) + 1;
        //这个写法就只递归了两次,节省了时间
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return left > right ? left + 1 : right + 1;
    }

    //两种写法都差不多
    public static int count_deep(TreeNode root) {
        if (root == null) return 0;
        int left = count_deep(root.left) + 1;
        int right = count_deep(root.right) + 1;

        return left > right ? left : right;
    }
}

运行截图

无

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值