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;
        }
        
    };
  • 相关阅读:
    学就要学好 就要学明白
    URL的基础
    各种waf识别
    Linux命令行上的上传和下载文件命令
    Linux服务器安全加固(三)
    Linux服务器安全加固(二)
    Linux服务器安全加固(一)
    Centos7配置SNMP服务
    Windows Server 系统通用安全基线配置详细
    Windows Server 2016 部署AD域控制器及添加AD域控制器
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8308637.html
Copyright © 2011-2022 走看看