1.问题描述
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7]
返回它的最大深度 3 。
2.问题分析
参考题解面试题55 - I. 二叉树的深度(后序遍历、层序遍历,清晰图解)
我是用后序遍历解答此题。
树的后序遍历 / 深度优先搜索往往利用 递归 或 栈 实现,本文使用递归实现。
关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1+1 。如:
算法解析:
终止条件: 当 root 为空,说明已越过叶节点,因此返回 深度 00 。
递推工作:本质上是对树做后序遍历。
1.计算节点 root 的 左子树的深度 ,即调用 maxDepth(root.left);
2.计算节点 root 的 右子树的深度 ,即调用 maxDepth(root.right);
3.返回值: 返回 此树的深度 ,即 max(maxDepth(root.left), maxDepth(root.right)) + 1。
看一组实现图片:
3.代码实现
3.1C++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL)
return 0;
int lenLeft = maxDepth(root->left) + 1;
int lenRight = maxDepth(root->right) + 1;
if(lenLeft>lenRight)
return lenLeft;
return lenRight;
}
};
3.2Java代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if(root==null)
return 0;
int lenleft=maxDepth(root.left)+1;
int lenright=maxDepth(root.right)+1;
if(lenleft>=lenright)
return lenleft;
return lenright;
}
}