1. 程式人生 > 實用技巧 >20.12.22 103. 二叉樹的鋸齒形層序遍歷

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;
    }
};