• 之字形打印二叉树


    题目

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

    思路

      这题和从上到下打印二叉树类似https://www.cnblogs.com/tianzeng/p/10186431.html;需要两个栈;打印某一层结点时,把下一层结点保存到相应的栈里

    1. 如果当前层是奇数层,先保存左子结点再保存右子结点到第一个栈里
    2. 如果当前层是偶数层,先保存右子结点再保存左子结点到第二个栈里

    输出顺序

    1

    3    2

    4    5    6   7

    15 14 13 12 12 10 9 8

    为什么用两个栈?

      如果只有一个栈,在打印根结点的时候,先后把2和3保存到栈里,在打印栈顶元素3的时候会把3的子节点(如果有的话)保存到栈里,这样以来,栈顶元素就不是2,无法打印元素2

    /*
    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* root) {
            if(!root)
                return {};
            vector<vector<int>> res;
            stack<TreeNode *> s1;
            stack<TreeNode *> s2;
            s1.push(root);
            
            while(!s1.empty()||!s2.empty())
            {
                if(!s1.empty())
                {
                    vector<int> arr;
                    while(!s1.empty())
                    {
                        auto tmp=s1.top();
                        s1.pop();
                        arr.push_back(tmp->val);
                        if(tmp->left)
                            s2.push(tmp->left);
                        if(tmp->right)
                            s2.push(tmp->right);
                    }
                    res.push_back(arr);
                }
                
                if(!s2.empty())
                {
                    vector<int> arr;
                    while(!s2.empty())
                    {
                        auto tmp=s2.top();
                        s2.pop();
                        arr.push_back(tmp->val);
                        if(tmp->right)
                            s1.push(tmp->right);
                        if(tmp->left)
                            s1.push(tmp->left);
                    }
                    res.push_back(arr);
                }
            }
            return res;
        }
    };
  • 相关阅读:
    2021.1.18 HTML标签及元素
    嵌入式发展史简述及一些概念
    06 突破512字节的限制 上
    50 排序的工程应用示例
    01 进阶操作系统
    05 主引导程序的扩展-下
    04 主引导程序的扩展-上
    03 调试环境的搭建
    在windows下使用linux命令,GnuWin32的使用.
    gcc -I -L -l区别
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10187981.html
Copyright © 2020-2023  润新知