代码随想录算法训练营第十六天|104.二叉树的最大深度 、 111.二叉树的最小深度、 222.完全二叉树的节点个数
思路代码来自y总:http://www.acwing.com
104.二叉树的最大深度
我是一看就会,一写就费。先看代码:
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root) return 0;
return max(maxDepth(root->left),maxDepth(root->right)) + 1;
}
};
这道题看起来代码非常简单,但是能用递归写出来,就很难,我最近发现递归的代码别看简洁,但是都很难想。这道题目就是上来了判断根节点,然后返回左右子树哪个层数更多一点,最后+1,加的是根节点。
111.二叉树的最小深度
先看代码:
class Solution {
public:
int minDepth(TreeNode* root) {
if(!root) return 0;
if(root->left && root->right) return min(minDepth(root->left),minDepth(root->right)) + 1;
if(root->left && !root->right) return minDepth(root->left) + 1;
return minDepth(root->right) + 1;
}
};
看到这道题目,很多人是不是跟我一样,按着二叉树的最大深度算的,哈哈哈,恭喜入坑,因为最小和最大不一样的是,如果按最大值的写法写最小值就是比较左右子树谁更小,按道理说没有什么问题,但是又有特例,如果某个二叉树只有一边难道最小的是没有的那一边吗?难道是1?所以,最大最小的关键就在这个特例里,所以除了基本的判断根节点,还要单独判断一边,最后判断两边都有的情况。
222.完全二叉树的节点个数
class Solution {
public:
int countNodes(TreeNode* root) {
int sum = 0;
if(!root) return 0;
if(root && !root->left && !root->right) return 1;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int len = q.size();
sum += len;
while(len--)
{
TreeNode* t = q.front();
q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return sum;
}
};
这道题目我用层次遍历,也就是广度优先遍历做的,换汤不换药,不过这里我要反思,我本来做这道题目的时候层次遍历已经写过5道题目了,这道题目居然写错模板了,真的是不该,每次TreeNode* t = q.front();都应该再while循环里,这样每次一个元素出队才有其左右子树进队。