uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

leetcode103-二叉树的锯齿形层序遍历

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

用两个栈来实现。先把根节点放入第一个栈。循环内部根据哪个栈为空判断新的节点放到哪个栈,确定先左还是先右。当两个栈都为空时,循环结束。

复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //void Tracking(vector<vector<int>> res,TreeNode* root,)
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(root==nullptr) return {};
        stack<TreeNode*> sss1;
        stack<TreeNode*> sss2;
        vector<vector<int>> res;
        sss1.push(root);
        bool flag=true;
        while(!sss1.empty()||!sss2.empty())
        {
            vector<int> temp;
            if(sss2.empty())
            {
                int size=sss1.size();
                for(int i=0;i<size;i++)
                {
                    TreeNode *t=sss1.top();
                    sss1.pop();
                    temp.push_back(t->val);
                    if(t->left) sss2.push(t->left);
                    if(t->right) sss2.push(t->right);
                }
            }
            else if(sss1.empty())
            {
                int size=sss2.size();
                for(int i=0;i<size;i++)
                {
                    TreeNode *t=sss2.top();
                    sss2.pop();
                    temp.push_back(t->val);
                    if(t->right) sss1.push(t->right);
                    if(t->left) sss1.push(t->left);
                }
            }
            res.push_back(temp);
        }
        return res;
    }
};
复制代码

评论区一个大佬的代码。既然已经知道每个一维数组的大小,那么就没有必要各种反转了。

复制代码
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(root==nullptr) return {};
        vector<vector<int>> res;
        queue<TreeNode*> sss;
        sss.push(root);
        bool flag=true;
        while(!sss.empty())
        {
            int size=sss.size();
            vector<int> temp(size,0);
            for(int i=0;i<size;i++)
            {
                TreeNode* t=sss.front();
                sss.pop();
                temp[flag?i:size-1-i]=t->val;
                if(t->left) sss.push(t->left);
                if(t->right) sss.push(t->right);
            }
            res.push_back(temp);
            flag=!flag;
        }
        return res;
    }
};
复制代码

 

posted on   ᶜʸᵃⁿ  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示