20.12.22 103. 二叉树的锯齿形层序遍历

题目

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

3

/
9 20
/
15 7
返回锯齿形层序遍历如下:

[
[3],
[20,9],
[15,7]
]

思路

  1. 剑指做过,本来以为会很快写完,还有写出bug来了,用了15分钟
  2. 想好用什么数据结构和流程是怎么样就可以了
  3. 我的思路是用两个栈,第一层是root;第二层从左往右压入,读出时就是从右往左;第三层从右往左压入,读出时就是从左往右
  4. 看了题解,用deque,思路是用queue层序遍历,把该层的数据压入deque。压入deque分两种情况,从头压入和从尾压入

代码

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(!root) return {};
        vector<vector<int>> ans;
        stack<TreeNode*> s1,s2;
        s1.push(root);
        while(!s1.empty() || !s2.empty()){
            vector<int> ansP;
            if(!s1.empty()){
                while(!s1.empty()){
                    TreeNode *curr = s1.top();
                    s1.pop();
                    ansP.push_back(curr->val);
                    if(curr->left) s2.push(curr->left);
                    if(curr->right) s2.push(curr->right);
                }
            }else{
                while(!s2.empty()){
                    TreeNode *curr = s2.top();
                    s2.pop();
                    ansP.push_back(curr->val);
                    if(curr->right) s1.push(curr->right);
                    if(curr->left) s1.push(curr->left);
                }
            }
            ans.push_back(ansP);
        }
        return ans;
    }
};
posted @ 2020-12-22 12:03  肥斯大只仔  阅读(66)  评论(0编辑  收藏  举报