【二叉树专题】剑指 Offer 32 – II. 从上到下打印二叉树

本问题对应课程链接:剑指offer刷题第五期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 21 个回答

  • 谁仁 普通 2023年9月20日 上午10:16

    // 后序遍历二叉搜索树
    void postorderTraversal(TreeNode* root) {
    if (root NULL) {
    return;
    }
    postorderTraversal(root->left);
    postorderTraversal(root->right);
    printf(“%d “, root->val);
    }//时间负载O(n),空间复杂度O(n)

    0 赞同 0 条回复
  • 黎明之前 普通 2023年9月8日 上午2:12

    //使用层序
    //使用二维数组存储最终结果 用一维数组存储单层的结果
    //使用队列存储数据
    //记录 每层的层数 先将头指针的数据存入 然后将其提取出来 再将左右指针的值存入对列 层数加一 备份队列的数据 不让丢失
    class Solution()
    {
    public:
    vector<vector> levelOrder(TreeNode *root)
    {
    vector<vector
    > res;
    if(rootNULL)
    return res;
    queue q{{root}};
    while(!q.empty)
    {
    int n = q.size();
    vector level(n);
    for(int i=0;i<n;i++)
    {
    auto t = q.front();
    q.pop();
    level.push_back(t->val);
    if(t->left)
    {
    q.push(t->left);

    }
    if(t->right)
    {
    q.push(t->right);
    }
    }
    res.push_back(level);
    }
    return res;
    }

    };

    0 赞同 0 条回复
  • Miracle· 普通 2023年9月5日 下午10:14

    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    * int val;
    * TreeNode left;
    * TreeNode *right;
    * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    class Solution {
    public:
    // 采用层序遍历的方法遍历
    vector<vector> levelOrder(TreeNode
    root) {
    vector<vector> res;
    if (root nullptr) return res;
    queue<TreeNode*> que; // 使用队列来存储当前层的节点
    que.emplace(root); // 将根节点入队
    while (!que.empty()) {
    int size = que.size(); // 表示当前层的节点数量
    vector cur; // 存储当前层的节点
    for (int i = 1; i <= size; ++i) {
    auto node = que.front();
    que.pop();
    cur.emplace_back(node->val);
    if (node->left) que.emplace(node->left);
    if (node->right) que.emplace(node->right);
    }
    // 将当前层的节点加入到数组中
    res.emplace_back(cur);
    }
    return res;
    }
    };

    0 赞同 0 条回复
  • 💮黧大王.exe 普通 2023年9月4日 下午4:37

    时间复杂度:O(n)
    空间复杂度:O(n)
    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    * int val;
    * TreeNode left;
    * TreeNode *right;
    * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    * };
    */
    class Solution {
    public:
    vector<vector> levelOrder(TreeNode
    root) {
    vector<vector> bfs;
    queue<TreeNode> q;
    if(rootNULL) return {};
    q.push(root);
    while(!q.empty()){
    vector vals;
    int n=q.size();
    for(int i=0;i<n;i++){
    TreeNode
    t = q.front();
    vals.push_back(t->val);
    if(t->left!=NULL) q.push(t->left);
    if(t->right!=NULL) q.push(t->right);
    q.pop();
    }
    bfs.push_back(vals);
    }
    return bfs;
    }
    };

    0 赞同 0 条回复
  • 羊毛同学 普通 2023年9月4日 下午4:36

    打卡

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> res;
            if(root == NULL) return res;
            queue<TreeNode *> q;
            q.push(root);
            while(!q.empty()){
                int k = q.size();//此时队列里的元素个数就是当层的元素个数
                vector<int> tmp;
                for(int i = 0; i < k; i++){
                    TreeNode * t = q.front();
                    q.pop();
                    if(t->left != NULL) q.push(t->left);
                    if(t->right != NULL) q.push(t->right);
                    tmp.push_back(t->val);
                }
                res.push_back(tmp);
            }
    
            return res;
    
        }
    };
    
    
    0 赞同 0 条回复
  • Marc 普通 2023年9月2日 下午8:47
    class Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            queue = [root]
            res = []
            while queue:
                size = len(queue)
                tmp = []
                for i in range(size):
                    cur = queue.pop(0)
                    tmp.append(cur.val)
                    if cur.left: 
                        queue.append(cur.left)
                    if cur.right:
                        queue.append(cur.right)
                res.append(tmp)
            return res         
    

    时间On

    0 赞同 0 条回复
  • 小肸 永久会员 2023年8月28日 下午1:53
    class Solution {
    
        public List> levelOrder(TreeNode root) {
            List> res = new ArrayList<>();
            Deque queue = new LinkedList<>();
            if (root != null) {
                queue.offer(root);
            }    
            while (!queue.isEmpty()) {
                //记录当前层有多少个节点
                int count = queue.size();
                List tmp = new ArrayList<>();
                while (count -- > 0) {
                    TreeNode node = queue.poll();
                    tmp.add(node.val);
                    if (node.left != null) {
                        queue.offer(node.left);
                    } 
                    if (node.right != null) {
                        queue.offer(node.right);
                    }
                }
                res.add(tmp);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • sc_Yang 普通 2023年8月26日 下午6:03

    利用辅助记长,来在while内部实现小循环

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            queue<TreeNode*> que;
            vector<vector<int>> result;
            if(root==NULL){return result;}
            que.push(root);
            while(!que.empty()){
                result.push_back(vector<int>());
                int curLevelSize = que.size();
                for(int i=0;i<curLevelSize;++i){
                    TreeNode* node = que.front();
                    que.pop();
                    result.back().push_back(node->val);
                    if(node->left) que.push(node->left);
                    if(node->right) que.push(node->right);
    
                }
            }
            return result;
        }
    };
    
    0 赞同 0 条回复
  • sincere 普通 2023年8月26日 下午3:52
    • 思路:层序遍历,遍历每一层时通过获取队列大小确定当前层节点数
    • 复杂度:时间复杂度O(n),空间复杂度O(n)
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> list = new ArrayList<>();
            if (root == null) {
                return list;
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                int count = queue.size();// 本层节点数
                List<Integer> tmpList = new ArrayList<>();
                while (count-- > 0) {
                    TreeNode node = queue.poll();
                    tmpList.add(node.val);
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                }
                list.add(tmpList);
            }
            return list;
        }
    }
    
    0 赞同 0 条回复
  • Sheng 永久会员 2023年8月26日 下午3:25

    类似于32-|

        //从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印,每一层打印一行
        public List<List<Integer>> levelOrder(TreeNode root) {
            if(root <span class="text-highlighted-inline" style="background-color: #fffd38;"> null) return new LinkedList<List<Integer>>();</span>
    
    <pre><code>    List<List<Integer>> result = new LinkedList<List<Integer>>();
        Queue<TreeNode> tmp = new LinkedList<TreeNode>();
    
        tmp.add(root);
        while(tmp.size()!=0) {
            List<Integer> level = new LinkedList<Integer>();
            int size=tmp.size();
            for(int i=0; i<size; i++) {
                TreeNode temp = tmp.remove();
                level.add(temp.val);
                if(temp.left != null) tmp.add(temp.left);
                if(temp.right != null) tmp.add(temp.right);
            }
            result.add(level);
        }
        return result;
    }
    </code></pre>
    
    0 赞同 0 条回复
  • 辰北、 普通 2023年8月23日 下午4:58

    时间on空间on
    和上一题差不多,加了2为数组,和for循环来判断每层装哪些元素;
    ““““c
    #define MAX_SIZE 10000
    int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    *returnSize = 0; // 初始化返回结果的大小为0

    if (root == NULL) {
        return NULL;  // 如果根节点为空,则直接返回空指针
    }
    
    int* ans = (int*)calloc(MAX_SIZE, sizeof(int));  // 分配存储结果的数组空间
    struct TreeNode* queue[MAX_SIZE] ;  // 定义一个队列,用于存储节点指针
    memset(queue, 0, sizeof(struct TreeNode*));  // 初始化队列为NULL
    
    int head = 0;  // 队列头指针
    int tail = 0;  // 队列尾指针
    
    queue[tail++] = root;  // 将根节点入队
    int **res =(int** )malloc(sizeof(int*)*MAX_SIZE);//二级数组装层
    *returnColumnSizes =(int*)malloc(sizeof(int*)*MAX_SIZE);//一级数组装值;
    while(head<tail){
        int size=(tail-head+MAX_SIZE)%MAX_SIZE;
        (*returnColumnSizes)[*returnSize]=size;
        res[*returnSize] = (int*) malloc(sizeof(int)*size);
        for(int i=0;i<size;i++){
            struct TreeNode* temp =queue[head++];
            res[*returnSize][i]=temp->val;
            if(temp->left){
                queue[tail++]=temp->left;
            }
            if(temp->right){
                queue[tail++]=temp->right;
            }
    
        }
        (*returnSize)++;
    
    }
    return res;
    

    }
    // 这段代码实现了从上到下按层打印二叉树,并将每一层的节点值保存在一个二维数组中,同时返回每一层的节点个数。
    // 首先,对于特殊情况,如果根节点为空,函数将返回空指针,并将返回数组的大小 returnSize 设置为0。
    // 然后,我们使用一个队列来进行BFS(广度优先搜索)。定义一个大小为 MAXSIZE 的队列 queue,并初始化头指针 head 和尾指针 tail 都为0。
    // 接下来,我们动态分配内存给返回的二维数组 res 和用于存储每一层节点个数的一维数组 *returnColumnSizes。这里使用 malloc 函数进行内存分配,所以在调用该函数之后记得在合适的时候释放内存。
    // 然后,将根节点加入队列 queue 中,表示第一层的节点。并将 returnSize 初始化为0。
    // 在循环中,使用队列的大小 size 来遍历当前层的所有节点。首先,将 size 存入 returnColumnSizes 数组中,表示当前层的节点个数。然后,为当前层的节点值分配内存,并将节点值保存到 res 数组中。
    // 接着,通过出队操作(queue[head++])将当前层的节点从队列中取出,并将其值存储到 res 数组中相应的位置。
    // 同时,如果当前节点存在左子节点,则将左子节点加入队列中;如果当前节点存在右子节点,则将右子节点加入队列中。这样可以保证下一层的节点按从左到右的顺序加入队列。
    // 最后,在循环结束后,将 returnSize 增加1,表示已经遍历完一层。最终,函数返回保存节点值的二维数组 res。

    0 赞同 0 条回复
  • 木木 普通 2023年8月22日 下午4:06

    時間複雜度 O(n) 空間複雜度 O(n)
    利用每一層的節點數 來逐個將該層節點值加入答案vector中儲存

    
    class Solution {
    public:
        vector> levelOrder(TreeNode* root) {
          vector> res;
          if (root == NULL) {
            return res;
          }
          queue q;
          q.push(root); 
          while(!q.empty()) {
            int q_size = q.size();
            vector level; //record the values of current layer
            //for loop for traversing each layer from left to right
            for (int i = 0; i < q_size; i++) {
              TreeNode* curr = q.front();
              q.pop();
              level.push_back(curr->val);
              if (curr->left != NULL) 
                q.push(curr->left);
              if (curr->right != NULL) 
                q.push(curr->right);
            }
            res.push_back(level);
          }
          return res;
        }
    };
    
    0 赞同 0 条回复
  • 木子有点甜🍒 普通 2023年8月22日 上午11:43

    算法流程思考:
    第一步,梳理题目解题步骤或者解题条件,比如本题解题的两个个条件是:
    1. 按层打印;
    2. 每层打印到一行。
    第二步,为每一个解题条件提供对应的解题思路:
    对于1,又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。
    对于2, 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。通过每一层的队列长度来控制。
    第三步,思考算法流程:
    首先,处理特例情况(为空)以及初始化;
    其次,有循环则先考虑循环的跳出条件(我们的两个解题条件都需要循环):
    外部循环——BFS循环跳出条件:当queue为空时跳出;
    循环内步骤:
    新建一个临时表tmp,存储本层临时打印结果;
    内部循环——在BFS中,每层的循环跳出条件:当层的queue的元素全部pop(),即队列长度为0,通过range(len(queue))来控制。
    循环步骤:
    出队;
    打印;
    添加子节点

    class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
    if root is None:return []
    queue = collections.deque()
    tree = []

        queue.append(root)       
    
        while queue:
            tmp = []
    
            for _ in range(len(queue)):
                node = queue.popleft()
    
                tmp.append(node.val)
    
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
    
            tree.append(tmp)
    
        return tree
    
    1 赞同 0 条回复
  • 帝心引力 永久会员 2023年8月21日 下午8:56
    时间o(n),空间o(n)
    vector<vector<int>> levelOrder(TreeNode* root) {
            if(root == NULL) return {};
    
            vector<vector<int>> ans;
            queue<TreeNode*> que;
            que.push(root);
    
            while(!que.empty()){
                int n = que.size(); // 得到当前层的节点个数
                vector<int> tmp; // 用于存储当前层的节点值
                while(n){
                    TreeNode* node = que.front();
                    tmp.emplace_back(node->val);
                    if(node->left) que.push(node->left);
                    if(node->right) que.push(node->right);
                    que.pop();
                    n--;
                }
                ans.emplace_back(tmp);
            }
            return ans;
        }
    
    0 赞同 0 条回复
  • JustRtn 普通 2023年8月21日 下午6:58

    时间复杂度O(n),空间复杂度O(n)

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            if (root == nullptr) {
                return {};
            }
    
            vector<vector<int>> vv;
            vector<int> v;
            TreeNode* node;
            std::queue<TreeNode*> que;
            que.push(root);
    
            while (!que.empty()) {
                int size = que.size();
                while (size--) {
                    node = que.front();
                    que.pop();
                    v.push_back(node->val);
                    if (node->left)
                        que.push(node->left);
                    if (node->right)
                        que.push(node->right);
                }
                vv.push_back(v);
                v.clear();
            }
    
            return vv;
        }
    };
    
    0 赞同 0 条回复
  • 逸兴遄飞 普通 2023年8月21日 下午4:04
    • 时间复杂度O(N);
    • 空间复杂度O(N);
    class Solution {
         /**
         * 层次遍历
         * 每次开始遍历取k = queue.size(),遍历的k个元素都是同一层
         */
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            if(root == null){
                return res;
            }
            Deque<TreeNode> queue = new LinkedList<>();
            List<Integer> list = new ArrayList<>();
            queue.add(root);
            while(!queue.isEmpty()){
                int size = queue.size();
    
                for(int i = 0; i < size; i++){
                    TreeNode cur = queue.poll();
                    list.add(cur.val);
                    if(cur.left != null){
                        queue.add(cur.left);
                    }
                    if(cur.right != null){
                        queue.add(cur.right);
                    }
                }
                res.add(list);
                list = new ArrayList<>();
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 海浪漂哇漂 普通 2023年8月21日 上午12:40

    打卡

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> ret = new ArrayList<List<Integer>>();
            if(root == null){
                return ret;
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                List<Integer> level = new ArrayList<>();
                int currentLevelSize = queue.size();
                for(int i = 1; i <= currentLevelSize; ++i){
                    TreeNode node = queue.poll();
                    level.add(node.val);
                    if(node.left != null){
                        queue.offer(node.left);
                    }
                    if(node.right != null){
                        queue.offer(node.right);
                    }
                }
                ret.add(level);
            }
            return ret;
        }
    }
    
    0 赞同 0 条回复
  • 别扒拉我 普通 2023年8月20日 下午10:11

    1、层次遍历。保存每层的节点个数

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            if(root == null){
                return res;
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while(!queue.isEmpty()){
                List<Integer> level = new ArrayList<Integer>();
                int currentLevelSize = queue.size();
    
                for(int i=0; i<currentLevelSize; i++){
                    TreeNode tmp = queue.poll();
                    level.add(tmp.val);
                    if(tmp.left != null){
                        queue.add(tmp.left);
                    }
                    if(tmp.right != null){
                        queue.add(tmp.right);
                    }
                }
                res.add(level);
    
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • c 普通 2023年8月20日 下午8:37

    层序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            if (root==null){
                return res;
            }
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            int size;
            TreeNode node;
            while (!queue.isEmpty()){
                List<Integer> list = new ArrayList<>();
                size=queue.size();
                for (int i = 0; i < size; i++) {
                    node=queue.poll();
                    if (node.left!=null){
                        queue.add(node.left);
                    }
                    if (node.right!=null){
                        queue.add(node.right);
                    }
                    list.add(node.val);    
                }
                res.add(list);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 行动派小彩笔 普通 2023年8月20日 下午5:01
     // 层次遍历,时间复杂度O(n),空间复杂度O(n);
    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            if(!root) return {};
            vector<vector<int>> ans;
            queue<TreeNode*> q;
            q.push(root);
    
            while(!q.empty())
            {
                int n = q.size();
                vector<int> vec;
                while(n--)
                {
                    TreeNode* node = q.front();
                    q.pop();
                    vec.push_back(node->val);
                    if(node->left) q.push(node->left);
                    if(node->right) q.push(node->right);
                }
                ans.push_back(vec);
            }
        return ans;
        }
    };
    
    0 赞同 0 条回复
  • 塔底的仰望 永久会员 2023年8月20日 下午4:55
    lass Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            //先判断特殊情况
            if (root == null) {
                return new ArrayList<List<Integer>>();
            }
            List<List<Integer>> list = new ArrayList<>();
            List<Integer> level = new ArrayList<>();
            Queue<TreeNode> q = new LinkedList<>();
            q.add(root);
            int len = 1;
            while (!q.isEmpty()) {
                TreeNode p = q.poll();
                len--;
                if (len == 0) {
                    level.add(p.val);
                    list.add(level);
                    level = new ArrayList<>();                
                    if (p.left != null) {
                        q.add(p.left);
                    }
                    if (p.right != null) {
                        q.add(p.right);
                    }
                    len = q.size();
                } else {
                    level.add(p.val);
                    if (p.left != null) {
                        q.add(p.left);
                    }
                    if (p.right != null) {
                        q.add(p.right);
                    }
                }
            }
            return list;
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答