第六章 二叉树part03
1.LeetCode.104.二叉树的最大深度 559.n叉树的最大深度
1.1题目链接:104.二叉树的最大深度 559.n叉树的最大深度
1.2思路:本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度;而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
1.3附加代码如下所示:
//采用递归法 后序遍历:后序遍历计算根节点,高度而根节点的高度就是二叉树的最大深度
class Solution {
public:
int getdepth(TreeNode*node)
{
if(node==NULL)return 0;
int leftdepth=getdepth(node->left);//左
int rightdepth=getdepth(node->right);//右
int depth=1+max(leftdepth,rightdepth);//中
return depth;
}
int maxDepth(TreeNode* root) {
return getdepth(root);
}
};
2.LeetCode. 104.二叉树的最小深度
2.1题目链接:111.二叉树的最小深度
2.2思路:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点。
本题还有一个误区,在处理节点的过程中,最大深度很容易理解,最小深度就不那么好理解,如图:
2.3附加代码如下所示:
//递归法 后序遍历
class Solution {
public:
int getdepth(TreeNode*node)
{
if(node==NULL)return 0;
int leftdepth=getdepth(node->left);//左
int rightdepth=getdepth(node->right);//右
//这时候要考虑左右子树一个为空一个不为空的情况,不能去子树为空的情况,因为不符合题目意思
if(node->left==NULL&&node->right!=NULL)//中
{
return 1+rightdepth;
}
else if(node->left!=NULL&&node->right==NULL)
{
return 1+leftdepth;
}
else
{
return 1+min(leftdepth,rightdepth);
}
}
int minDepth(TreeNode* root) {
return getdepth(root);
}
};
3.LeetCode.222.完全二叉树的节点个数
3.1题目链接:222.完全二叉树的节点个数
3.2思路:给出按照普通二叉树的求法以及利用完全二叉树性质的求法
3.3附加代码如下所示
//递归法 后序遍历,完全二叉树形式,考虑到会有满完全二叉树情况
class Solution {
public:
int getNum( TreeNode*node)
{
if(node==NULL)return 0;
TreeNode*left=node->left;
TreeNode*right=node->right;
int leftdepth=0;int rightdepth=0;
//处理满完全二叉树情况,只需要验证左右子树的深度是否一样就行,然后用公式就能计算出节点总数
while(left)
{
leftdepth++;
left=left->left;
}
while(right)
{
rightdepth++;
right=right->right;
}
if(leftdepth==rightdepth)return (2<<leftdepth)-1;
//处理不是满完全二叉树情况
else
{
int leftnum=getNum(node->left);//左
int rightnum=getNum(node->right);//右
return 1+leftnum+rightnum;//中
}
}
int countNodes(TreeNode* root) {
return getNum(root);
}
};