双队列实现从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

本文介绍了一种使用双队列实现的二叉树层序遍历算法,通过交替使用两个队列来确保每层节点能够从左至右依次输出,同时详细展示了算法的具体流程及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没写水题了,今天水一波。。。

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

TreeQ1                        TreeQ2

-----------------------       ----------------------- 

空                                1

-----------------------       -----------------------

刚开始把头结点放到TreeQ2中(Q2其实就是该深度的等待队列)

Q1空闲,把Q2中的所有数调度到Q1中。

这时候,会发现,1会有两个儿子[2,3],因为[2,3]是深度为2的结点,故push到Q2中等待

TreeQ1                        TreeQ2

-----------------------       ----------------------- 

1                                2  3

-----------------------       -----------------------

把[1]存入vector的第一行,然后pop掉,稳妥,接着,调度[2,3]到Q1中,发现[2,3]有儿子[4,5,6,7],push到Q2中等待。

TreeQ1                        TreeQ2

-----------------------       ----------------------- 

2  3                             4  5  6  7

-----------------------       -----------------------

最后大家会发现,其实,Q2就是层序的过程。

附代码如下!!

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
        vector<vector<int> > Print(TreeNode* pRoot) {
            
            vector<vector<int> > ans;
            vector<int > tmp;
            queue<TreeNode* > TreeQ1;
            queue<TreeNode* > TreeQ2;
            TreeQ2.push(pRoot);
            while(!TreeQ2.empty()){
                
                while(!TreeQ2.empty()){
                    if(TreeQ2.front() != NULL){
                        TreeQ1.push(TreeQ2.front());
                    }
                    TreeQ2.pop();
                }
                while(!TreeQ1.empty()){
                    TreeQ2.push(TreeQ1.front()->left);
                    TreeQ2.push(TreeQ1.front()->right);
                    tmp.push_back(TreeQ1.front()->val);
                    TreeQ1.pop();
                }
                if(!TreeQ2.empty()){
                    ans.push_back(tmp);
                    tmp.clear();
                }
            }
            return ans;
        }
    
};

加油啦!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值