• 牛客网剑指offer第59题——按之字形顺序打印二叉树


    题目:

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

    思路:这个题目是典型的按行打印二叉树,但是不同于之前都是从左至右打印那种顺序(都是从左至右的是使用栈)。这个题目的本质是:下一次的打印都是倒叙的,基于这个特征,我们定义两个栈:一个栈用于存储奇数行节点,一个栈用于存储偶数行节点。

    比如我们在打印第一行的节点时(stack1出栈),将第二行按照从左至右的顺序入栈(stack2入栈);那么当我们打印第二行的时候(stack2出栈),就是从右至左的顺序打印;当我们从右至左打印第二行的时候,将关联的第三行子节点从右至左入栈(stack1入栈),则当我们打印第三行时(stack1出栈),就又是从左至右的顺序.....

    代码:

    /*
    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_level;//stack1
            stack<TreeNode*> even_level;//stack2
            odd_level.push(pRoot);
            while((!odd_level.empty()) || (!even_level.empty()))
            {
                if(!odd_level.empty())
                {
                    vector<int> midres;
                    while(!odd_level.empty())
                    {
                        TreeNode*topNode = odd_level.top();
                        odd_level.pop();
                        midres.push_back(topNode->val);
                        if(topNode->left != nullptr)
                            even_level.push(topNode->left);
                        if(topNode->right != nullptr)
                            even_level.push(topNode->right);
                    }
                    res.push_back(midres);
                }
                else if(!even_level.empty())
                {
                    vector<int> midres;
                    while(!even_level.empty())
                    {
                        TreeNode*topNode = even_level.top();
                        even_level.pop();
                        midres.push_back(topNode->val);
                        if(topNode->right != nullptr)
                            odd_level.push(topNode->right);
                        if(topNode->left != nullptr)
                            odd_level.push(topNode->left);
                    }
                    res.push_back(midres);
                }
            }
            return res;
        }
    };
  • 相关阅读:
    SQL数据库——存储过程
    常用命令
    八大排序算法
    Java 反射的理解
    Java 集合的理解(持续更新......)
    JAVA 用数组实现 ArrayList
    JVM 运行时的内存分配
    Java中的增强 for 循环 foreach
    Java 泛型
    《七》随机访问文件流
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12691841.html
Copyright © 2020-2023  润新知