【代码随想录day 12】 力扣 102.107.199. 二叉树的层序遍历

发布于:2025-08-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

视频讲解:https://www.bilibili.com/video/BV1GY4y1u7b2/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_637-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%B9%B3%E5%9D%87%E5%80%BC
力扣题目:https://leetcode.cn/problems/binary-tree-level-order-traversal/
https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/
https://leetcode.cn/problems/binary-tree-right-side-view/

关于二叉树的层序遍历,需要用到队列这一数据结构,当遍历到一层时,将这一层节点的左节点和右节点压入队列中,然后下一次循环中弹出一个父节点再压入两个子节点,要注意que.size()是随着层数不断变化的。
假设又有个15个元素的4层二叉树

               1
            /     \
          2         3
        /  \       /  \
      4     5     6     7
     / \   / \   / \   / \
    8  9  10 11 12 13 14 15

那么每一次循环的队列元素如下所示:

1
23//1弹出,加入左右节点23
345//2弹出,加入左右节点45
4567//3弹出,加入左右节点67
56789
67891011
...
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode *> que;
        if(root!=NULL)
            que.push(root);
        vector<vector<int>> result;
        while(!que.empty())
        {
            int size = que.size();
            //printf("%d\n",size);
            vector<int> vec;
            for(int i=0;i<size;i++)
            {
                TreeNode *node=que.front();
                que.pop();
                vec.push_back(node->val);
                if(node->left)
                    que.push(node->left);
                if(node->right)
                    que.push(node->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};
  1. 二叉树的层序遍历 II这一题与其类似,只不过要求从下网上遍历,我们只需要将上一题的结果反转即可。
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode *> que;
        if(root!=NULL) que.push(root);
        vector<vector<int>> result;
        while(!que.empty())
        {
            int size=que.size();
            vector<int> vec;
            for(int i=0;i<size;i++)
            {
                TreeNode *node=que.front();
                que.pop();
                vec.push_back(node->val);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
            result.push_back(vec);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};
  1. 二叉树的右视图,这一题要求只返回最右边的元素,我们判断便利的元素是否为本行最后一个元素即可。
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        queue<TreeNode *> que;
        if(root!=NULL) que.push(root);
        vector<int> result;
        while(!que.empty())
        {
            int size= que.size();
            for(int i=0;i<size;i++)
            {
                TreeNode *node=que.front();
                que.pop();
                //如果是这一行最后一个元素,就存进去
                if(i==size-1) result.push_back(node->val);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
        }
        return result;

    }
};

网站公告

今日签到

点亮在社区的每一天
去签到