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;
        }
        
    };
  • 相关阅读:
    0基础学小程序----day1
    比较两个库的表信息
    SQL Server 2008 临时解除约束删除表中数据
    HTML5音乐、视频等新媒体播放标签video、audio、embed与object介绍以及使用方式
    Docker最全教程——从理论到实战(一)
    SQL Server查询优化方法
    idea插件esayCode自动生成代码(代码生成器)
    SQL Server 小技巧
    Java和C#与SQL Server、MySQL和Oracle数据类型对照映射表
    笔记 | 史上最全的正则表达式
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8308637.html
Copyright © 2011-2022 走看看