zoukankan      html  css  js  c++  java
  • 【剑指Offer-举例让抽象问题具体化】面试题32.2:之字形打印二叉树

    题目描述

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

    思路

    • 使用两个栈s1,s2:s1用来存储奇数层的节点,s2用来存储偶数层的节点(层数从1开始);
    • 先将根结点压入s1;
    • 当前层是奇数层时,弹出s1中的节点,并将弹出节点的左孩子、右孩子依次压入到s2中,直至s1为空;
    • 当前层是偶数层时,弹出s2中的节点,并将弹出节点的右孩子、左孩子依次压入到s1当中,直至s2为空;
    • 重复前面两步,直至s1,s2都为空。

    代码如下:

    /*
    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>> ans;
            if(pRoot==nullptr)
                return ans;
            
            stack<TreeNode*> s1;
            stack<TreeNode*> s2;
            s1.push(pRoot);
            int curLayer = 1;    //当前是第几层
            while(!s1.empty() || !s2.empty()){
                if(curLayer%2!=0){
                    vector<int> temp;    //存储当前层的节点
                    while(!s1.empty()){
                        TreeNode* node = s1.top();
                        s1.pop();
                        if(node!=nullptr){
                            temp.push_back(node->val);
                            s2.push(node->left);
                            s2.push(node->right);
                        }
                    }
                    if(!temp.empty()){
                        //curLayer++;
                        ans.push_back(temp);
                    }
                }
                else{
                    vector<int> temp;
                    while(!s2.empty()){
                        TreeNode* node = s2.top();
                        s2.pop();
                        if(node!=nullptr){
                            temp.push_back(node->val);
                            s1.push(node->right);
                            s1.push(node->left);
                        }
                    }
                    if(!temp.empty()){
                        //curLayer++;
                        ans.push_back(temp);
                    }
                }
                curLayer++;
            }
            return ans;
        }
        
    };
    
  • 相关阅读:
    GB2312 字符集
    Excel导入
    Excel导出
    解决文件下载在火狐浏览器出现中文文件名乱码的方法
    Struts2将图片输出到页面
    jsp页面中日期的格式化
    java正则表达式笔记
    利用git将项目上传到github
    Java中枚举的写法和用法
    自定义JQuery插件
  • 原文地址:https://www.cnblogs.com/flix/p/12632690.html
Copyright © 2011-2022 走看看