• (剑指Offer)面试题61:按之字形顺序打印二叉树


    题目:

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

    思路:

    按照广度优先遍历来遍历二叉树,但是需要按照之字形来打印,意味着:

    奇数行从左到右,跟BFS的遍历顺序一样,而偶数行从右到左,跟BFS的遍历顺序相反。

    因此我们不能直接采用队列,可以通过两个栈来实现,一个实现先进先出,即入栈顺序为右子节点、左子节点;一个实现后进先出,即入栈顺序为左子节点、右子节点。(具体参照代码)

    在线测试:

    http://www.nowcoder.com/books/coding-interviews/91b69814117f4e8097390d107d2efbe0?rp=3

    AC代码:

    /*
    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> > result;
             
            if(pRoot == NULL)
                return result;
             
            stack<TreeNode*> stk1;
            stack<TreeNode*> stk2;
            stk1.push(pRoot);
            TreeNode* tmp;
            vector<int> tLevel;
             
            while(!stk1.empty() || !stk2.empty())
            {
                if(!stk1.empty())
                {
                    while(!stk1.empty())
                    {
                        tmp=stk1.top();
                        tLevel.push_back(tmp->val);
                        if(tmp->left)
                            stk2.push(tmp->left);
                        if(tmp->right)
                            stk2.push(tmp->right);
                        stk1.pop();
                    }
                    result.push_back(tLevel);
                    tLevel.clear();
                }
                else
                {
                    while(!stk2.empty())
                    {
                        tmp=stk2.top();
                        tLevel.push_back(tmp->val);
                        if(tmp->right)
                            stk1.push(tmp->right);
                        if(tmp->left)
                            stk1.push(tmp->left);
                        stk2.pop();
                    }
                    result.push_back(tLevel);
                    tLevel.clear();
                }
            }
            return result;
         
        }
         
    };
  • 相关阅读:
    fastapi教程进阶
    fastapi快速入门
    Linux yum安装PostgreSQL9.6
    harbor helm仓库使用
    Dockfile文件解析
    K8S概念理解
    转载---Beats:如何使用Filebeat将MySQL日志发送到Elasticsearch
    Elasticsearch中text与keyword的区别
    filebeat知识点
    logstash知识点
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4722286.html
Copyright © 2020-2023  润新知