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

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

题干

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

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

返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]

题解

一开始的想法,和一般层序遍历没什么区别,只要在最后把所有奇数下标的数组倒置即可

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

其实还可以用双端队列(deque push_front push_back),这样避免了最后倒置的处理

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

猜你喜欢

转载自blog.csdn.net/weixin_43662405/article/details/111564432