利用栈的特性,采用两个栈来实现:

  • 栈1,存放偶数层节点
  • 栈2,存放奇数层节点

栈1出栈的时候,将下一层节点push到栈2,这样就实现了不断反转的效果。

有一个至关重要的细节:对栈2出栈并将下一层节点推入栈1的过程中,需要先入右节点再入左节点,否则无法保证顺序。这个特性可以借助例子推导一下。

//
// Created by jt on 2020/8/22.
//
#include <vector>
#include <stack>
using namespace std;


class Solution {
public:
    /**
     *
     * @param root TreeNode类
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
        // write code here
        vector<vector<int> > res;
        if (!root) return res;
        stack<TreeNode *> stk1, stk2; // stk1存储偶数层,stk2存储奇数层
        stk1.push(root);
        while (!stk1.empty() || !stk2.empty()) {
            vector<int> vec;
            while (!stk1.empty()) {
                TreeNode *node = stk1.top();
                stk1.pop();
                vec.push_back(node->val);
                if (node->left) stk2.push(node->left);
                if (node->right) stk2.push(node->right);
            }
            if (vec.size() > 0) res.push_back(vec);
            vec.clear();
            while (!stk2.empty()) {
                TreeNode *node = stk2.top();
                stk2.pop();
                vec.push_back(node->val);
                // 偶数层:先入右再入左
                if (node->right) stk1.push(node->right);
                if (node->left) stk1.push(node->left);
            }
            if (vec.size() > 0) res.push_back(vec);
        }
        return res;
    }
};