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;
        }
        
    };
    
  • 相关阅读:
    关于互联网产品经理的认知
    互联网产品经理的工作职责
    软件需求分析方法
    Enumeration遍历http请求参数的一个例子
    jquery datatable使用简单示例
    改变输出的文字的字体格式
    excel 类获取起始列和使用列
    调试不能命中断点
    CString转换为const char*
    __declspec(dllexport)
  • 原文地址:https://www.cnblogs.com/flix/p/12632690.html
Copyright © 2011-2022 走看看