Leetcode 103. Zigzag sequence traversal of binary tree

Leetcode 103. Zigzag sequence traversal of binary tree

Question stem

Given a binary tree, return the zigzag sequence traversal of its node values. (That is, traverse the next layer from left to right, then from right to left, and so on, alternating between layers).

For example:
given binary tree [3,9,20, null, null, 15,7],
. 3
/
. 9 20 is
/
15. 7

Return the zigzag sequence traversal as follows:
[
[3],
[20,9],
[15,7]
]

answer

The initial idea is no different from the general sequence traversal, as long as the array of all odd subscripts is inverted at the end.

class Solution {
    
    
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    
    
        vector<vector<int> > ans;
        if(root == nullptr){
    
    
            return ans;
        }
        queue<TreeNode*> treeLevel;
        treeLevel.push(root);

        while(!treeLevel.empty()){
    
    
            vector<int> temp;
            int levelSize = treeLevel.size();
            for(int i = 0 ; i < levelSize ; ++i){
    
    
                auto now = treeLevel.front();
                treeLevel.pop();
                if(now->left != nullptr){
    
    
                    treeLevel.push(now->left);
                }
                if(now->right != nullptr){
    
    
                    treeLevel.push(now->right);
                }
                temp.push_back(now->val);
            }
            ans.push_back(temp);
        }
        for(int i = 0 ; i < ans.size() ; ++i){
    
    
            if(i % 2 == 1){
    
    
                reverse(ans[i].begin(),ans[i].end());
            }
        }
        return ans;
    }
};

In fact, you can also use a double-ended queue (deque push_front push_back), which avoids the last inversion processing

class Solution {
    
    
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    
    
        vector<vector<int> > ans;
        if(root == nullptr){
    
    
            return ans;
        }
        queue<TreeNode*> treeLevel;
        treeLevel.push(root);
        bool isOddLevel = false;

        while(!treeLevel.empty()){
    
    
            deque<int> oddLevel;
            int levelSize = treeLevel.size();
            for(int i = 0 ; i < levelSize ; ++i){
    
    
                
                auto now = treeLevel.front();
                treeLevel.pop();

                if(isOddLevel){
    
    
                    oddLevel.push_front(now->val);
                }else{
    
    
                    oddLevel.push_back(now->val);
                }

                if(now->left != nullptr){
    
    
                    treeLevel.push(now->left);
                }
                if(now->right != nullptr){
    
    
                    treeLevel.push(now->right);
                }
            }
            isOddLevel = !isOddLevel;
            ans.push_back(vector<int>{
    
    oddLevel.begin(),oddLevel.end()});
        }
        return ans;
    }
};

Guess you like

Origin blog.csdn.net/weixin_43662405/article/details/111564432