目录
4. LeetCode102. 二叉树的层序遍历
5.LeetCode107. 二叉树的层序遍历 II
6. LeetCode199. 二叉树的右视图
7. LeetCode637. 二叉树的层平均值
8. LeetCode429. N 叉树的层序遍历
9. LeetCode515. 在每个树行中找最大值
10. LeetCode116. 填充每个节点的下一个右侧节点指针
11. LeetCode117. 填充每个节点的下一个右侧节点指针 II
14. LeetCode225. 翻转二叉树
class Solution {
public:
vector> levelOrder(TreeNode* root) {
if(root==NULL){
return {};
}
queuequ;
qu.push(root);
vector>res;
while(!qu.empty()){
vectorvec;//记录每层节点值
for(int i=qu.size();i>0;i--){
TreeNode*node=qu.front();
qu.pop();//注意qu的size是不断变化的
vec.push_back(node->val);
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
}
res.push_back(vec);
}
return res;
}
};
思路:把从上到下的层序遍历数组反转一下即可
class Solution {
public:
vector> levelOrderBottom(TreeNode* root) {
if(root==NULL){
return {};
}
queuequ;
qu.push(root);
vector>res;
while(!qu.empty()){
vectorvec;//记录每层节点值
for(int i=qu.size();i>0;i--){
TreeNode*node=qu.front();
qu.pop();//注意qu的size是不断变化的
vec.push_back(node->val);
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
}
res.push_back(vec);
}
reverse(res.begin(),res.end());
return res;
}
};
class Solution {
public:
vector rightSideView(TreeNode* root) {
vectorres;
if(root==NULL)return res;
queuequ;
qu.push(root);
while(!qu.empty()){
for(int i=qu.size();i>0;i--){
TreeNode*node=qu.front();
qu.pop();
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
if(i==1){
res.push_back(node->val);//每层最后一个节点即最右节点
}
}
}
return res;
}
};
class Solution {
public:
vector averageOfLevels(TreeNode* root) {
vectorres;
if(root==NULL)return res;
queuequ;
qu.push(root);
while(!qu.empty()){
double sum=0;
int size=qu.size();
for(int i=0;ival;
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
}
res.push_back(sum/size);
}
return res;
}
};
class Solution {
public:
vector> levelOrder(Node* root) {
vector>res;
if(root==NULL)return res;
queuequ;
qu.push(root);
while(!qu.empty()){
vectorvec;
for(int i=qu.size();i>0;i--){
Node*node=qu.front();
qu.pop();
vec.push_back(node->val);
for(int j=0;jchildren.size();j++){
qu.push(node->children[j]);
}
}
res.push_back(vec);
}
return res;
}
};
class Solution {
public:
vector largestValues(TreeNode* root) {
vectorres;
if(root==NULL)return res;
queuequ;
qu.push(root);
while(!qu.empty()){
int maxVal=INT_MIN;
for(int i=qu.size();i>0;i--){
TreeNode*node=qu.front();
qu.pop();
maxVal=max(maxVal,node->val);
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
}
res.push_back(maxVal);
}
return res;
}
};
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL)return root;
queuequ;
qu.push(root);
while(!qu.empty()){
int size=qu.size();
Node*pre=NULL;
Node*cur=NULL;
for(int i=0;inext=cur;
pre=pre->next;
}
if(cur->left)qu.push(cur->left);
if(cur->right)qu.push(cur->right);
}
cur->next=NULL;
}
return root;
}
};
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL)return root;
queuequ;
qu.push(root);
while(!qu.empty()){
int size=qu.size();
Node*pre=NULL;
Node*cur=NULL;
for(int i=0;inext=cur;
pre=pre->next;
}
if(cur->left)qu.push(cur->left);
if(cur->right)qu.push(cur->right);
}
cur->next=NULL;
}
return root;
}
};
思路:
只要能遍历二叉树每个节点并交换其左右子节点即可,但是中序遍历例外。
中序遍历顺序:左中右
1.左子节点先交换自己的左右孩子
2.关键:父节点交换自己的左右孩子
3.此时的右子节点是原先的左子节点,其左右孩子被交换两次,而原先左子节点未交换其左右孩子
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL)return root;
queuequ;
qu.push(root);
while(!qu.empty()){
for(int i=qu.size();i>0;i--){
TreeNode*node=qu.front();
qu.pop();
swap(node->left,node->right);
if(node->left)qu.push(node->left);
if(node->right)qu.push(node->right);
}
}
return root;
}
};
以上的题目都是统一的套路,利用队列对二叉树进行层序遍历,对每一层进行相应的操作。