002.二叉树题单(1)
层序遍历相关
102 二叉树的层序遍历
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == nullptr) return res;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int siz = q.size();
vector<int> vec(siz);
for(int i = 0 ; i < siz ; i ++)
{
TreeNode* p = q.front();
q.pop();
vec[i] = p->val;
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
}
res.push_back(vec);
}
return res;
}
};
107 二叉树的层序遍历II
1.把之前做过的 102 题的层序遍历拿出来
2.在 return 之前加一句 reverse(ans.begin(), ans.end());
3.提交,通过
美好的一天从现在开始(
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
if(root == nullptr) return res;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int siz = q.size();
vector<int> vec(siz);
for(int i = 0 ; i < siz ; i ++)
{
TreeNode* p = q.front();
q.pop();
vec[i] = p->val;
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
}
res.push_back(vec);
}
reverse(res.begin(),res.end());
return res;
}
};
199 二叉树的右视图
记录每层的最后一个节点即可
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> res;
if(root == nullptr) return res;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int siz = q.size();
while(siz--)
{
TreeNode* p = q.front();
q.pop();
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
if(siz == 0) res.push_back(p->val);
}
}
return res;
}
};
637 二叉树的层序遍历
模板,不解释
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> res;
if(root == nullptr) return res;
queue<TreeNode*> q;
q.push(root);
while(q.size())
{
int siz = q.size();
double ave = 0;
for(int i = 0 ; i < siz ; i ++)
{
TreeNode* p = q.front();
q.pop();
ave += (double)p->val;
if(p->left) q.push(p->left);
if(p->right) q.push(p->right);
}
ave /= siz;
res.push_back(ave);
}
return res;
}
};
429 N叉树的层序遍历
更一般的情况,思路没有变
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> res;
queue<Node*>q;
if(root == nullptr) return res;
q.push(root);
while(q.size())
{
int siz = q.size();
vector<int> vec(siz);
for(int i = 0 ; i < siz ; i ++)
{
Node* p = q.front();
q.pop();
vec[i] = p->val;
for(Node* ch : p->children)
{
if(ch != nullptr) q.push(ch);
}
}
res.push_back(vec);
}
return res;
}
};
二叉树的深度
429 二叉树的最大深度
深搜然后随时更新答案即可
class Solution {
public:
void dfs(TreeNode* root,int dep,int& maxdep)
{
if(root == nullptr) return;
maxdep = max(maxdep,dep);
dfs(root->left,dep+1,maxdep);
dfs(root->right,dep+1,maxdep);
}
int maxDepth(TreeNode* root) {
int ans = 0;
dfs(root,1,ans);
return ans;
}
};
111 二叉树的最小深度
深搜即可
class Solution {
public:
void dfs(TreeNode* root,int dep,int& mindep)
{
if(root == nullptr) return;
if(!root -> left && !root -> right) mindep = min(dep,mindep);
dfs(root->left,dep+1,mindep);
dfs(root->right,dep+1,mindep);
}
int minDepth(TreeNode* root) {
int ans = 1e9;
if(root == nullptr) return 0;
dfs(root,1,ans);
return ans;
}
};
二叉树的LCA问题
236 二叉树的最近公共祖先
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || root == p || root == q) return root;
TreeNode *left = lowestCommonAncestor(root->left, p, q);
TreeNode *right = lowestCommonAncestor(root->right, p, q);
if(left == nullptr) return right;
if(right == nullptr) return left;
return root;
}
};

浙公网安备 33010602011771号