剑指offer: 按之字形顺序打印二叉树

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

 

解题思路:

利用一个双端队列,一个方向标志,当本行是从左往右遍历时,将其子节点按 左节点 右节点 的顺序先后加入到队列头;当本行是从右往左遍历时,将其子节点按 右节点 左节点 的顺序先后加入到队列尾; 

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> res;
        if(!pRoot)
            return res;
        
        deque<TreeNode*> deq;
        deq.push_back(pRoot);
        bool ltor = false;
        
        while(!deq.empty()) {
            int sz = deq.size();
            ltor = !ltor;
            
            vector<int> row;
            while(sz--) {
                if(ltor) {
                    pRoot = deq.back();
                    deq.pop_back();
                    row.push_back(pRoot->val);
                    if(pRoot->left)
                        deq.push_front(pRoot->left);
                    if(pRoot->right)
                        deq.push_front(pRoot->right);
                }
                else {
                    pRoot = deq.front();
                    deq.pop_front();
                    row.push_back(pRoot->val);
                    if(pRoot->right)
                        deq.push_back(pRoot->right);
                    if(pRoot->left)
                        deq.push_back(pRoot->left);
                }
            }
            
            res.push_back(row);
        }
        return res;
    }
    
};

 

©️2020 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值