转载本文章请标明作者和出处
本文出自《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);
}
}
}