剑指offer | 面试题55 - I.二叉树的深度

转载本文章请标明作者和出处
本文出自《Darwin的程序空间》
本文题目和部分解题思路来源自《剑指offer》第二版

在这里插入图片描述

开始行动,你已经成功一半了,献给正在奋斗的我们

题目

输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度;

给定如图的二叉树,返回它的最大深度3;

在这里插入图片描述

解题分析

求最大的深度,我们常规来想需要探索到每一个叶子节点,看看哪一个叶子节点最深,即为所求,探索到每一个叶子节点,其实所有的节点都要探索到,连父节点都没探索到,你又怎么探索到叶子节点呢?

所以,我们可以想到我们想到二叉树的遍历(前序、中序、后序,这块不动的可以看楼主的另外一篇博客,里面有详细说明重建二叉树),这几种遍历都是就可以探索每一个节点的整颗左子树和右子树的,所以我们的想法是,让根节点往下递归的过程中,带上一个参数level,用来表示这个是树的第几层的节点,比如刚开始root节点3进去之后,level就等于1,然后我们记录下现在的层级最大值就是1,然后节点3有左子节点9,然后进入节点9,level等于2,然后节点9没有左右子节点,返回,到节点3的右节点20,此时level还是2,然后节点3有左子节点15,level为3,节点15没有左右子节点,进入近点20的右子节点7,level还是等于3,节点7没有左右子节点,于是返回,递归结束,最后level为3,返回答案;

下图为我手绘,示例中代码执行时虚拟机栈的执行图,用来帮助大家理解;

在这里插入图片描述
在这里插入图片描述

代码(JAVA实现)

ps:这里笔者使用的jdk为1.8版本

class Solution {
    /* 二叉树的最大深度 */
    private int maxDepth = 0;

    public int maxDepth(TreeNode root) {
        if (root != null) {
            recursive(root, 1);
        }
        return maxDepth;
    }

    private void recursive(TreeNode root, int level) {
        if (level > maxDepth) {
            maxDepth = level;
        }
        if (root.left != null) {
            recursive(root.left, level + 1);
        }
        if (root.right != null) {
            recursive(root.right, level + 1);
        }
    }
}


喜欢的朋友可以加我的个人微信,我们一起进步
发布了156 篇原创文章 · 获赞 19 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qq_36929361/article/details/104475538