美文网首页
按之字形顺序打印二叉树

按之字形顺序打印二叉树

作者: Crazy_Bear | 来源:发表于2020-07-24 11:05 被阅读0次
    • 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
    • 使用两个栈,记为st_1(存储正向打印的数据), st_2(存储逆向打印的数据),打印方向必然与存储顺序相反
      • 当打印方向为正向时,即从st_1出栈时,st_2应当按序存储每个点的孩子节点,切先存储左孩子,再存右孩子
      • 当打印方向为逆向时,即从st_2出栈时,st_1应当按序存储每个点的孩子节点,切先存储右孩子,再存左孩子
      • 一次正向打印和一次逆向打印为一次循环
    • C++ 代码
    /*
    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;
            vector<int> tmp;
            if(!pRoot) return res;
            stack<TreeNode *> q;
            stack<TreeNode *> s;
            q.push(pRoot);
            while(!q.empty()||!s.empty()){
            while(!q.empty()){
                tmp.push_back(q.top()->val);
                TreeNode * left = q.top()->left;
                TreeNode * right = q.top()->right;
                if(left)
                s.push(left);
                if(right)
                s.push(right);
                q.pop();
            }
                res.push_back(tmp);
                tmp.clear();
             while(!s.empty()){
                tmp.push_back(s.top()->val);
                TreeNode * left = s.top()->left;
                TreeNode * right = s.top()->right;
                if(right)
                q.push(right);
                if(left)
                q.push(left);
                s.pop();
            }
                if(!tmp.empty())
                res.push_back(tmp);
                tmp.clear();
            }
            return res;
        }  
    };
    

    相关文章

      网友评论

          本文标题:按之字形顺序打印二叉树

          本文链接:https://www.haomeiwen.com/subject/nyhjlktx.html