104.二叉树的最大深度
其实就是有多少层;
层序遍历
class Solution {
public:
int maxDepth(TreeNode* root) {
queue<TreeNode*> q;
int ans=0;
if(root!=nullptr) q.push(root);
while(!q.empty()){
ans++;
int size=q.size();
for(int i=0;i<size;i++){
auto t=q.front();
q.pop();
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return ans;
}
};
后序遍历
返回以t为根的子树的高度;
求最大深度,只要有孩子就往下走;
class Solution {
public:
int dfs(TreeNode* t){
if(t==nullptr) return 0;
return 1+max(dfs(t->left),dfs(t->right));
}
int maxDepth(TreeNode* root) {
int ans=dfs(root);
return ans;
}
}
111.二叉树的最小深度
层序遍历
class Solution {
public:
int minDepth(TreeNode* root) {
queue<TreeNode*> q;
int ans=0;
if(root!=nullptr) q.push(root);
while(!q.empty()){
ans++;
int size=q.size();
bool flag=false;
for(int i=0;i<size;i++){
auto t=q.front();
q.pop();
if(t->left==NULL&&t->right==NULL){
flag=true;
break;
}
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
if(flag) break;
}
return ans;
}
};
后序遍历
返回的是以t为根子树的高度;
如果没有左子树,只返回右子树+1;如果没有右子树,只返回左子树+1;倘若不这样,一个节点只有右子树,很长,最后的答案是到这个节点就终止,因为没有左子树,左子树返回的是0,但是这并不满足题意(到叶子节点);
class Solution {
public:
int dfs(TreeNode*t){
if(t==nullptr) return 0;
int l=dfs(t->left);
int r=dfs(t->right);
if(l==NULL&&r!=NULL) return 1+r;
if(l!=NULL&&r==NULL) return 1+l;
return 1+min(l,r);
}
int minDepth(TreeNode* root) {
return dfs(root);
}
};
222.完全二叉树的节点个数
返回以t为根的子树节点个数;
后序遍历,左右中;
还可以把cnt放到参数,或者放到全局变量;
class Solution {
public:
int dfs(TreeNode* t){
if(t==nullptr) return 0;
return 1+dfs(t->left)+dfs(t->right);
}
int countNodes(TreeNode* root) {
return dfs(root);
}
};