zoukankan      html  css  js  c++  java
  • 按之字形顺序打印二叉树

    题目描述

    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
    之字形:
    思路:
    之字形:就是一层是从左向右,一层是从右向左。最初的想法是用一个计数点i,用i的奇偶来判断从右还是从左。
    后来发现下一层开始遍历的点就是上一层最后放入的点,所以我们选择栈。由于来回变换所以我们要选择两个栈。就不用i来判断了。
    vector的压入,弹出函数为:push_back()   pop_back();(返回值为void)得到最后一个元素back() 得到第一个元素begin(),得到最后一个元素,back()
    queue的压入,弹出函数为:push() pop();(返回值为void)队首元素front() 队尾元素back() 队列中元素个数size()
    stack的压入,弹出函数为:push()  pop() (返回值为void) 得到栈顶元素top()  队列元素size()
    我的代码:
        vector<vector<int> > Print(TreeNode* pRoot) {
            vector<int> in;
            vector<vector<int>> out;
            if(pRoot == NULL)
                return out;
            stack<TreeNode*> sta;
            stack<TreeNode*> tmp;
            sta.push(pRoot);
            in.push_back(pRoot->val);
            out.push_back(in);
            in.clear();
            TreeNode* ptmp;
            while(!sta.empty())
            {
                while(!sta.empty())
                {
                    ptmp = sta.top();
                    sta.pop();//外层先右后左
                    if(ptmp->right)
                    {
                        tmp.push(ptmp->right);
                        in.push_back(ptmp->right->val);
                    }
                    if(ptmp->left)
                    {
                        tmp.push(ptmp->left);
                        in.push_back(ptmp->left->val);
                    }
                }
                if(in.size())
                {
                    out.push_back(in);
                    in.clear();
                }
                while(!tmp.empty())
                {
                    ptmp = tmp.top();
                    tmp.pop();
                    if(ptmp->left)
                    {
                        sta.push(ptmp->left);
                        in.push_back(ptmp->left->val);
                    }
                    if(ptmp->right)
                    {
                         sta.push(ptmp->right);
                         in.push_back(ptmp->right->val);
                    }
                }
                if(in.size())
                {
                    out.push_back(in);
                    in.clear();
                }
            }
            return out;
        }

     

  • 相关阅读:
    MS SQLSERVER 第三天
    MS SQLSERVER 第二天
    今天开始我的 MSSQLSERVER 之旅
    从今天开始就正式我的博客之旅
    mac 本地搭建mybatisGenerator代码生成环境
    idea中git远程版本回退
    Junit调试解决本地多线程异步调用
    Lambda表达式总结
    JDK8函数式编程之Stream API
    MySql分页查询慢的解决方案
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9293177.html
Copyright © 2011-2022 走看看