Leetcode 103. Recorrido de secuencia en zigzag de árbol binario

Leetcode 103. Recorrido de secuencia en zigzag de árbol binario

Tallo de la pregunta

Dado un árbol binario, devuelve el recorrido de la jerarquía en zigzag de sus valores de nodo. (Es decir, atraviese la siguiente capa de izquierda a derecha, luego de derecha a izquierda, y así sucesivamente, alternando entre capas).

Por ejemplo:
dado árbol binario [3,9,20, null, null, 15,7],.
3
/
. 9 20 es
/
15. 7

Devuelve el recorrido de la secuencia en zigzag de la siguiente manera:
[
[3],
[20,9],
[15,7]
]

responder

La idea inicial no es diferente del recorrido de secuencia general, siempre que la matriz de todos los subíndices impares esté invertida al final.

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

De hecho, también puede utilizar una cola de dos extremos (deque push_front push_back), que evita el procesamiento de la última inversión

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

Supongo que te gusta

Origin blog.csdn.net/weixin_43662405/article/details/111564432
Recomendado
Clasificación