104。二叉树的最大深度
我们用后序深度遍历的方法去遍历。可以写成递归的形式。我们求的其实是高度,因为最大高度和最大深度是一样的。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr) return 0;
int left=maxDepth(root->left);
int right=maxDepth(root->right);
int depth=max(left,right)+1;
return depth;
}
};
111.二叉树的最小深度
这道题和最大深度的思路很像,但是要注意的是要考虑三种情况,不能无脑取最小值,否则遇到为空的时候就会错。这里用的也是后序遍历。
class Solution {
public:
int minDepth(TreeNode* root) {
if(root==nullptr)
return 0;
int left=minDepth(root->left);
int right=minDepth(root->right);
if(root->left!=nullptr&&root->right!=nullptr)
return min(left,right)+1;
if(root->left!=nullptr&&root->right==nullptr)
return left+1;
else return right+1;
}
};
222.完全二叉树的节点个数
这道题还是后序遍历,因为我们需要知道左右子树节点的个数才能统计这棵子树节点的个数。我们可以利用完全二叉树的一些性质来减少运算,完全二叉树的子树也一定是完全二叉树。而完全二叉树如果是满二叉树那么两侧高度应该完全一致,否则一定不是。我们如果遇到是满二叉子树的情况就可以直接利用公式而不用向下递归减少运算量。但是也可以直接暴力递归出所有节点个数。
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==nullptr)
return 0;
TreeNode *left=root->left;
TreeNode *right=root->right;
int lefthigh=0;
int righthigh=0;
while(left!=nullptr)
{
left=left->left;
lefthigh++;
}
while(right!=nullptr)
{
right=right->right;
righthigh++;
}
if(lefthigh==righthigh)
return pow(2,lefthigh+1)-1;
int leftnum=countNodes(root->left);
int rightnum=countNodes(root->right);
return leftnum+rightnum+1;
}
};