问题描述:
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
**题解:**确实不应该进行人肉递归,不然自己转在里面出不来啦就!找到重复子问题,并用数学归纳法总结出来。本题思路,二叉树的最大深度就是 左子树的深度+1 与 右子树深度+1 进行比较,大的数值即为最终的深度。注意结束条件是root为NULL。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL) return 0;
int left=maxDepth(root->left)+1;
int right=maxDepth(root->right)+1;
return left>right?left:right;
}
};
2021.5.31
class Solution {
public:
int treeDepth(TreeNode* root) {
return dfs(root);
}
int dfs(TreeNode* root)
{
if(!root) return 0;
return max(dfs(root->left),dfs(root->right))+1;
}
};
111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:2
示例 2:
输入:root = [2,null,3,null,4,null,5,null,6]
输出:5
看起来与上一题还挺类似,按照上一题将max改为min会出现一个问题,比如根节点有右子树,没有左子树,这样按照那样的做法会得到深度为1。这恰恰是不对的,分析一下,如果左子树为空,需要根据右子树的节点来计算,反之,类似。因此需要在代码中加入11行和12行代码。
class Solution {
public:
int minDepth(TreeNode* root) {
return dfs(root);
}
int dfs(TreeNode* root)
{
if(!root) return 0;
int left=dfs(root->left);
int right=dfs(root->right);
if(!root->left) return 1+right;
if(!root->right) return 1+left;
return min(left,right)+1;
}
};