LeetCode二叉树经典题目(六):层序遍历

目录

4. LeetCode102. 二叉树的层序遍历

5.LeetCode107. 二叉树的层序遍历 II

6. LeetCode199. 二叉树的右视图

7. LeetCode637. 二叉树的层平均值

8. LeetCode429. N 叉树的层序遍历

9. LeetCode515. 在每个树行中找最大值

10. LeetCode116. 填充每个节点的下一个右侧节点指针

11. LeetCode117. 填充每个节点的下一个右侧节点指针 II

14. LeetCode225. 翻转二叉树


4. LeetCode102. 二叉树的层序遍历

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if(root==NULL){
            return {};
        }
        queue<TreeNode*>qu;
        qu.push(root);
        vector<vector<int>>res;
        while(!qu.empty()){
            vector<int>vec;//记录每层节点值
            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;
    }
};

5.LeetCode107. 二叉树的层序遍历 II

思路:把从上到下的层序遍历数组反转一下即可
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        if(root==NULL){
            return {};
        }
        queue<TreeNode*>qu;
        qu.push(root);
        vector<vector<int>>res;
        while(!qu.empty()){
            vector<int>vec;//记录每层节点值
            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;
    }
};

6. LeetCode199. 二叉树的右视图

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int>res;
        if(root==NULL)return res;
        queue<TreeNode*>qu;
        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;
    }
};

7. LeetCode637. 二叉树的层平均值

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        vector<double>res;
        if(root==NULL)return res;
        queue<TreeNode*>qu;
        qu.push(root);
        while(!qu.empty()){
            double sum=0;
            int size=qu.size();
            for(int i=0;i<size;i++){
                TreeNode*node=qu.front();
                qu.pop();
                sum+=node->val;
                if(node->left)qu.push(node->left);
                if(node->right)qu.push(node->right);
            }
            res.push_back(sum/size);
        }
        return res;
    }
};

8. LeetCode429. N 叉树的层序遍历

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>>res;
        if(root==NULL)return res;
        queue<Node*>qu;
        qu.push(root);
        while(!qu.empty()){
            vector<int>vec;
            for(int i=qu.size();i>0;i--){
                Node*node=qu.front();
                qu.pop();
                vec.push_back(node->val);
                for(int j=0;j<node->children.size();j++){
                    qu.push(node->children[j]);
                }
            }
            res.push_back(vec);
        }
        return res;
    }
};

9. LeetCode515. 在每个树行中找最大值

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        vector<int>res;
        if(root==NULL)return res;
        queue<TreeNode*>qu;
        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;
    }
};

10. LeetCode116. 填充每个节点的下一个右侧节点指针

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL)return root;
        queue<Node*>qu;
        qu.push(root);
        while(!qu.empty()){
            int size=qu.size();
            Node*pre=NULL;
            Node*cur=NULL;
            for(int i=0;i<size;i++){
                if(i==0){
                    cur=qu.front();
                    qu.pop();
                    pre=cur;
                }else{
                    cur=qu.front();
                    qu.pop();
                    pre->next=cur;
                    pre=pre->next;
                }
                if(cur->left)qu.push(cur->left);
                if(cur->right)qu.push(cur->right);
            }
            cur->next=NULL;
        }
        return root;
    }
};

11. LeetCode117. 填充每个节点的下一个右侧节点指针 II

class Solution {
public:
    Node* connect(Node* root) {
         if(root==NULL)return root;
        queue<Node*>qu;
        qu.push(root);
        while(!qu.empty()){
            int size=qu.size();
            Node*pre=NULL;
            Node*cur=NULL;
            for(int i=0;i<size;i++){
                if(i==0){
                    cur=qu.front();
                    qu.pop();
                    pre=cur;
                }else{
                    cur=qu.front();
                    qu.pop();
                    pre->next=cur;
                    pre=pre->next;
                }
                if(cur->left)qu.push(cur->left);
                if(cur->right)qu.push(cur->right);
            }
            cur->next=NULL;
        }
        return root;
    }
};

14. LeetCode226. 翻转二叉树

思路:
只要能遍历二叉树每个节点并交换其左右子节点即可,但是中序遍历例外。
中序遍历顺序:左中右
1.左子节点先交换自己的左右孩子
2.关键:父节点交换自己的左右孩子
3.此时的右子节点是原先的左子节点,其左右孩子被交换两次,而原先左子节点未交换其左右孩子
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if(root==NULL)return root;
        queue<TreeNode*>qu;
        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;
    }
};

以上的题目都是统一的套路,利用队列对二叉树进行层序遍历,对每一层进行相应的操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jomo.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值