zoukankan      html  css  js  c++  java
  • 58按之字形顺序打印二叉树 +队列访问使用front和back,栈才是top

    题目描述

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
     
    思路:最暴力的方法就是使用队列进行层次遍历,使用sz存储每层的节点个数。然后反转偶数层就可以了。
    优化方法:使用两个栈,一个栈存奇数层的结果,按照先左孩子节点后右孩子节点的方式压栈。另一个栈存偶数层的结果,按照先右孩子节点再左孩子结点的方式压栈。
    还有个忽视的bug,就是循环里面有一个栈为空的话,就会压入一个空的vector到result里面,因此压栈前需要判断是否为空。
    想想:第一个栈是逆序的,第二个栈反两次得原来的顺序,就完成了逆序。
    /*
    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> > res;
            if(pRoot == nullptr){
                return res;
            }
            
            stack<TreeNode*> odd,even;
            odd.push(pRoot);
            while(odd.size() != 0 || even.size() != 0){
                TreeNode* tmp;
                vector<int> vtmp;
                while(odd.size() != 0){
                    tmp = odd.top();
                    odd.pop();
                    vtmp.push_back(tmp->val);
                    if(tmp->left){
                        even.push(tmp->left);
                    }
                    if(tmp->right){
                        even.push(tmp->right);
                    }
                    
                }
                if(vtmp.size()!=0){
                    res.push_back(vtmp);
                }
                
                vector<int> ().swap(vtmp);
                while(even.size() != 0){
                    tmp = even.top();
                    even.pop();
                    vtmp.push_back(tmp->val);
                    if(tmp->right){
                        odd.push(tmp->right);
                    }
                    if(tmp->left){
                        odd.push(tmp->left);
                    }
                    
                }
                if(vtmp.size()!=0){
                    res.push_back(vtmp);
                }
                
            }
            return res;
        }
        
    };
  • 相关阅读:
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day4 Div1
    CCPC-Wannafly Winter Camp Day5 Div1
    Luogu 1603
    洛谷试炼场
    Codeforces 1100
    Codeforces 1099E
    Codeforces 1099
    Luogu 1093
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8308637.html
Copyright © 2011-2022 走看看