1.二叉树最大深度
我们需要等递归到所有的节点并且求出每一个叶子位置所对应的最大深度,那么我们需要使用后续遍历。
1.确认参数为一个节点,并且我们需要得到深度的值,那么返回值为int
2.递归中,如果节点为空节点,那么就可返回0了,因为已经到底了,该节点位置没有高度
3.先是后续遍历的左右节点递归操作,我们需要得到值,走到这些位置执行时是由上一个节点而来,那么我们需要把上一个节点的高度算进去,left和right往后递归前需要加1。最后我们执行到操作部分,我们只需要将left和right中深度高的那个数值返回即可
class Solution {
public:
int _maxR(TreeNode* root)
{
if(root==nullptr)
return 0;
int left = _maxR(root->left)+1;
int right = _maxR(root->right)+1;
return (left>right)?left:right;
}
int maxDepth(TreeNode* root) {
return _maxR(root);
}
};
2.二叉树最小深度
我们需要等递归到所有的节点并且求出每一个叶子位置所对应的最小深度,那么我们需要使用后续遍历。不过,需要注意的是题目的最小深度是由根节点到叶子节点的位置,叶子节点的左右节点都为空,这点是需要注意的。
1.确认参数为一个节点,并且我们需要得到深度的值,那么返回值为int
2.递归中,如果节点为空节点,那么就可返回0了,因为已经到底了,该节点位置没有高度
3.先是后续遍历的左右节点递归操作,我们只需要得到上一次递归高度的值即可。到执行位置,我们其实有三种状态:
左边空,右边不空:此时说明不是叶子节点,我们还有往右走
左边不空,右边空:此时也不是叶子节点,我们还有往左走
左右都不为空,依然比较左右两边的高度谁大谁小
class Solution {
public:
int _minR(TreeNode* root)
{
if(root==nullptr)
return 0;
int left = _minR(root->left);
int right = _minR(root->right);
if(root->right==nullptr&&root->left!=nullptr)
return 1+left;
if(root->left==nullptr&&root->right!=nullptr)
return 1+right;
int min = left>right?right:left;
return min+1;
}
int minDepth(TreeNode* root) {
return _minR(root);
}
};
3.完全二叉树个数
我们只需要计算每经过一次节点,计数值加一的操作即可,所有使用前序遍历
1.确认参数为一个节点,和一个引用参数,因为我们需要在每一层都知道当前已经遍历过的节点数量,因为引用参数就是我们需要的值,那么返回值自然不需要,直接返回void
2.递归中,如果节点为空节点,那么就可返,因为已经到底了,该节点不存在
3.先对当前的节点进行加一处理,那么count++;随后左右节点进行相同的操作即可
class Solution {
public:
void _countR(TreeNode* root, int& count)
{
if(root==nullptr)
return;
count++;
_countR(root->left,count);
_countR(root->right,count);
}
int countNodes(TreeNode* root) {
int count = 0;
_countR(root,count);
return count;
}
};