首页 > 其他分享 >leetcode103-二叉树的锯齿形层序遍历

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

时间:2022-10-30 14:00:08浏览次数:81  
标签:right TreeNode int res 层序 二叉树 leetcode103 push left

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

 

标签:right,TreeNode,int,res,层序,二叉树,leetcode103,push,left
From: https://www.cnblogs.com/uacs2024/p/16841146.html

相关文章

  • leetcode102-二叉树的层序遍历
    102.二叉树的层序遍历有两种实现方法。第一种是递归,第二种是队列实现。第一种是看了别人的代码写出来的,第二种是自己写的。这道题的不能直接把遍历得到的数字直接塞进res......
  • 刷题 LeetCode二叉树2
    代码随想录LeetCode102.二叉树的层序遍历carl二叉树遍历#层序遍历#队列#广度优先思路队首是待访问节点,每访问一个节点,将其左子和右子加入队列细节如何知道某......
  • 树、森林与二叉树的互相转换
    1.树转为二叉树(1)从根节点往下开始,所有兄弟节点间连接虚线。(2)擦掉除根节点所连最左边的那条线以外的同层所有实线。(3)实线作为lchild所连的线,虚线作为rchild所连的线,全部......
  • leetcode94-二叉树的中序遍历
    94.二叉树的中序遍历迭代法,看别人的代码的,还需要琢磨一下/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;......
  • 代码随想录第十七天 | 二叉树
    今天继续二叉树的学习 110.平衡二叉树classSolution{publicbooleanisBalanced(TreeNoderoot){returndfs(root)>=0;}publicintdfs(......
  • 平衡二叉树、B树、B+树的区别
    1、平衡二叉树  2.B树  3.B+树  B+、B和平衡二叉树的区别:1)b,b+相对于平衡二叉树,节点可以存储多个元素,因此整体可以存储较多的数据,并且树的高度也会矮,可以减......
  • leetcode145-二叉树的后序遍历
    145.二叉树的后序遍历classSolution{public:vector<int>res;voidTracking(TreeNode*root){if(root==nullptr)return;Tracking......
  • 二叉树的其他重要操作
    二叉树的其他重要操作1,建树代码:1//建树2voidpre(tree&bt)//先序次序输入3{4charch;5ch=getchar();//单链表存储结构,bt为指向根结点......
  • 二叉树路径问题: 合集--所有路径-路径总和-路径总和 II-路径总和 III-最大路径和
    文章目录​​[257.二叉树的所有路径](https://leetcode-cn.com/problems/binary-tree-paths/)​​​​[112.路径总和](https://leetcode-cn.com/problems/path-sum/)​​......
  • 剑指offer - 面试题6:重建二叉树
    packageChapter2;/***面试题6:重建二叉树*输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。*假设输入的前序遍历和中序遍历的结果中都不含重复的数字。*......