leetcode102. 二叉树的层序遍历

本文详细介绍了如何使用C++实现二叉树的层次遍历(levelordertraversal),通过队列辅助结构进行逐层遍历,展示了`levelOrder`函数的逻辑和关键代码段,包括从队列中取出节点、更新节点值和添加子节点到队列的操作。
摘要由CSDN通过智能技术生成

说明:本博客所有内容为参考书籍以及他人博客总结,为个人学习笔记所用。

讲述看到这一题的思路
还是直接上,接着把!!!

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    //层序遍历的原理在于使用一个辅助的队列,根结点先入队,再将其数值存入tmp数组中
    //再根结点出队,将其左右结点都入队,进行第二层遍历,每一次遍历的结尾标志为队列内所有已有结点都出队完成,其对应的左右结点都入队完成,每一层的遍历结果都存入tmp中,在每一层的遍历结尾将tmp的内容存入到res中

        queue<TreeNode*>que;//设置辅助队列    
        
        vector<vector<int>>res;
        //根结点先入队,这么讲吧,这个要是没有根节点,压根就不需要在搞什么入不入的问题了
        if(root != nullptr)
            que.push(root);//看清楚这个进入队列的基本操作!!!
        
        while(! que.empty())
        {
            //每一层遍历以前都初始化tmp
            vector<int> tmp;
            //这里需注意由于在for循环的执行过程中que.size()的值会进行更改,因此que.size()只能作为i的起点而不是终点
            for(int i = que.size(); i > 0; --i)
            {
                root = que.front();

                que.pop();
                //在出队列的时刻进行打印,出队列的同时左右结点都入队列
                tmp.push_back(root -> val);
                //在出队列的时候,在进行遍历下面的这些节点
                //比如说是:这个节点的左节点,以及其的右节点的情况的发生
                if(root -> left != nullptr)
                    que.push(root -> left);
                if(root -> right != nullptr)
                    que.push(root -> right);

            }
        //将当前层结果 tmp 添加入 res 。
            res.push_back(tmp);
        }
        return res;//最后是要进行打印整个队列的
    }
};

作者:烟花真的易冷
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/2759597/102-er-cha-shu-de-ceng-xu-bian-li-by-yan-18p0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


全写在这个注释代码里了。

自己在进行复习一下:

public:

    vector<vector<int>> levelOrder(TreeNode* root) 

        queue<TreeNode*>que;//设置辅助队列    

       

        vector<vector<int>>res;

        //根结点先入队,这么讲吧,这个要是没有根节点,压根就不需要在搞什么入不入的问题了

        if(root != nullptr)

            que.push(root);

       //不为空,则继续进行循环操作

        while(! que.empty())

        {

            vector<int> tmp;//创建一个中间变量

            for(int i = que.size(); i > 0; --i)

            {

 root = que.front();是什么意思啊?

//

在编程上下文中,`root = que.front();` 这一行代码表示从一个名为 `que` 的队列(queue)中取出队首元素,并将其赋值给变量 `root`。

具体解释如下:

- `que` 是一个队列数据结构,通常用于按先进先出(FIFO)的原则存储和处理数据。
- `.front()` 是队列的一个成员函数,用于访问队列中的第一个元素,即队首元素,但不删除它。不同编程语言中的队列实现可能有所不同,但在 C++ STL 中的标准队列中,`.front()` 返回的是队列头部的对象引用或副本,但并不改变队列的状态。
- `root` 是一个变量,赋值操作 `root = que.front();` 将队列头部的元素赋值给 `root`。

如果是在与二叉树遍历相关的上下文中,这一行代码可能意味着将队列中的第一个(即最先入队的)二叉树节点赋值给 `root` 变量,以便进一步处理该节点及其子节点。例如,在层次遍历(BFS,广度优先搜索)算法中,常会用到这样的操作。

               

que.pop();

//这个的意思  上边

在编程尤其是C++的STL(标准模板库)中,`que.pop()` 表示从一个名为 `que` 的队列(queue)中移除并销毁第一个元素的操作。队列遵循FIFO(先进先出)原则,所以`pop()`函数会删除并返回(或在无返回值版本中只是移除)队列头部的元素,即最先加入队列的那个元素。

具体到C++ STL queue容器的`pop()`函数,其原型如下:

                                                        void pop();

此函数没有返回值,调用后会直接删除队列顶端的元素,队列的大小减一,并不影响队列中其他元素的位置。使用时需确保队列非空,否则行为未定义。

                tmp.push_back(root -> val);

                if(root -> left != nullptr)

                    que.push(root -> left);

                if(root -> right != nullptr)

                    que.push(root -> right);

            }

            res.push_back(tmp);

        }

        return res;

    }

};

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值