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

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

要求:

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

共以下 24 个回答

  • LovLe 普通 2024年12月22日 下午2:44

    层序打印,用deque

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    from collections import deque   #
    class Solution:
        def decorateRecord(self, root: Optional[TreeNode]) -> List[int]:
            if not root: return []
            queue=collections.deque()   #
            res=[]
            queue.append(root)
            while queue:
                for _ in range(len(queue)):
                    cur=queue.popleft()
                    res.append(cur.val) #放在这里添加res
                    if cur.left: queue.append(cur.left)
                    if cur.right: queue.append(cur.right)
            return res
    
    0 赞同 0 条回复
  • 岱 永久会员 2024年12月18日 下午4:54

    LCR 149. 彩灯装饰记录 I

    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if(root == null ) return new int[0];
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            ArrayList<Integer> ans = new ArrayList<>();
            while(!queue.isEmpty()){
                TreeNode node = queue.poll();
                ans.add(node.val);
                if(node.left!=null)queue.add(node.left);
                if(node.right!=null)queue.add(node.right);
            }
            //ArrayList变为数组
            int[] res = new int[ans.size()];
            for(int i = 0;i<ans.size();i++){
                res[i] = ans.get(i);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • mpweixin用户 普通 2024年12月16日 下午11:44
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> result;
            if(root == NULL) return result;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                TreeNode* temp = q.front();
                q.pop();
                result.push_back(temp->val);
                if(temp->left) q.push(temp->left);
                if(temp->right) q.push(temp->right);
            }
            return result;
    
        }
    };
    

    时间O(N),空间O(N)

    0 赞同 0 条回复
  • 🌟 普通 2024年12月14日 下午6:02

    中文
    class Solution {
    public:
    vector decorateRecord(TreeNode* root) {
    queue<TreeNode> node;
    vector result;
    if(root!=nullptr){
    node.push(root);
    }
    while(!node.empty()){
    TreeNode
    cur=node.front();
    node.pop();
    result.push_back(cur->val);

            if(cur->left) node.push(cur->left);
            if(cur->right) node.push(cur->right);
        }
        return result;
    }
    

    };

    0 赞同 0 条回复
  • 陆狗陆狗 普通 2024年12月4日 下午10:07

    题解
    使用队列先进先出的性质,先遍历到的会被记录下来,再复杂操作中可以把数据放到队列里面暂存

    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if (root == null) {
                // 【错误点1】:int[]的new的方式
                return new int[0];
            }
            // 定义队列去按照访问顺序放入元素
            // 【错误点2】:泛型元素的声明
            Queue<TreeNode> q = new LinkedList();
            // 定义链表存放值(因为个数不确定,不能建立数组了)
            List<Integer> resultList = new ArrayList();
            q.offer(root);
            while (!q.isEmpty()) {
                TreeNode tmpt = q.poll();
                // 值放入list中
                resultList.add(tmpt.val);
                // 左右节点放入队列中
                if (tmpt.left != null) {
                    q.offer(tmpt.left);
                }
                if (tmpt.right != null) {
                    q.offer(tmpt.right);
                }
            }
            // 链表的数据放到数组里面
            int[] reslut = new int[resultList.size()];
            for (int i = 0; i < resultList.size(); i++) {
                reslut[i] = resultList.get(i);
            }
            return reslut;
        }
    }
    
    • 错误点1:数组的初始化。int[]=new int[数组长度]
    • 错误点2:泛型要放入正确的类型,这里就要放入Node类型,而不是Integer类型
    0 赞同 0 条回复
  • Tom Yuan 普通 2024年12月4日 上午7:50

    方法:BFS 将每个字结构的根节点放入queue中,然后根据queue FIFO的原理来将左边的值先塞入结果的stack中。

        def decorateRecord(self, root: Optional[TreeNode]) -> List[int]:
            if not root:
                return []
            queue: deque[TreeNode] = deque()
            queue.append(root)
            stack = []
            while queue:
                node = queue.popleft()
                stack.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
    
            return stack
    

    time O(n) space O(n)

    0 赞同 0 条回复
  • 无言 永久会员 2024年12月3日 下午5:28
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> ans;
            queue<TreeNode*> que;
            if(root) que.push(root);
            while(!que.empty()) {
                TreeNode* node = que.front();
                ans.push_back(node->val);
                que.pop();
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
            return ans;
        }
    };
    时间复杂度:O(n) 
    空间复杂度:O(n) 
    
    0 赞同 0 条回复
  • 休一 普通 2024年12月2日 下午10:39
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> res;
            if(!root) return res;
            //创建队列
            queue<TreeNode*> stTree;
            stTree.push(root);
            //判断队列是否为空,如果空则代表遍历完成
            while(!stTree.empty()){
                TreeNode* cur = stTree.front();
                stTree.pop();
                //数据处理节点
                res.push_back(cur->val);
                //将左右节点压入队列
                if(cur->left) stTree.push(cur->left);
                if(cur->right) stTree.push(cur->right);
            }
            return res;
    
        }
    };
    
    • 时间复杂度o(n),空间复杂度o(n);
    0 赞同 0 条回复
  • Pendulumpal 普通 2024年12月2日 下午9:15

    层序遍历基础

        public int[] decorateRecord(TreeNode root) {
            if(root==null)return new int[0];
            Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
            ArrayList<Integer> ans = new ArrayList<>();
            while(!queue.isEmpty()) {
                TreeNode node = queue.poll();
                ans.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            int[] res = new int[ans.size()];
            for(int i = 0; i < ans.size(); i++)
                res[i] = ans.get(i);
            return res;
        }
    
    0 赞同 0 条回复
  • YULONG 永久会员 2024年11月30日 下午6:08
    /**
    方法一:层次遍历模版,时间复杂度O(N), 空间复杂度O(N)
     */
    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if (root == null){
                return new int[]{};
            }
            Deque<TreeNode> q = new ArrayDeque<>();
            List<Integer> res = new ArrayList<>();
            q.add(root);
            while (q.size() > 0){
                TreeNode node = q.pop();
                res.add(node.val);
                if (node.left != null){
                    q.add(node.left);
                }
                if (node.right != null){
                    q.add(node.right);
                }
            }
            int[] ans = new int[res.size()];
            for ( int i = 0; i < res.size(); i++){
                ans[i] = res.get(i);
            }
            return ans;
        }
    }
    
    0 赞同 0 条回复
  • Xiang. 永久会员 2024年11月29日 下午9:49
    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if(root==null) return new int[0];
            Queue<TreeNode> queue=new LinkedList();
            queue.offer(root);
            List<Integer> res=new ArrayList();
            while(!queue.isEmpty()){
                TreeNode tmpNode=queue.poll();
                if(tmpNode.left!=null) queue.offer(tmpNode.left);
                if(tmpNode.right!=null) queue.offer(tmpNode.right);
                res.add(tmpNode.val);
            }
            int len=res.size();
            int [] resArr=new int[len];
            for(int i=0;i<len;i++){
                resArr[i]=res.get(i);
            }
            return resArr;
        }
    }
    时间复杂度:O(n)
    空间复杂度:O(n)
    
    0 赞同 0 条回复
  • Kisara 普通 2024年11月29日 下午9:01

    用队列记录每一层的节点,从左到右,实现一个个输出

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        public int[] decorateRecord(TreeNode root) {
            ArrayList<Integer> list=new ArrayList<>();
            Queue<TreeNode> queue=new LinkedList<>();
            queue.add(root);
    
            if(root==null) return new int[0];
    
            while(!queue.isEmpty()){
                TreeNode node=queue.poll();
                list.add(node.val);
                if(node.left!=null) queue.add(node.left);
                if(node.right!=null) queue.add(node.right);
    
            } 
            int res[]=new int[list.size()];
            for(int i=0;i<list.size();i++){
                res[i]=list.get(i);
            }
    
            return res;
        }
    }
    

    on on

    0 赞同 0 条回复
  • 黑键〰 普通 2024年11月29日 下午7:15
    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {TreeNode} root
     * @return {number[]}
     */
    var decorateRecord = function(root) {
        if(!root) return []
        let q = [root]
        let res = []
        while(q.length > 0) {
            let len = q.length
            while(len) {
                let cur = q.shift()
                if(cur.left) q.push(cur.left)
                if(cur.right) q.push(cur.right)
                res.push(cur.val)
                len--
            }
        }
        return res
    };
    

    思路:层序遍历,队列存每一层的节点,记录节点数,循环完当前层之后进入下一层
    时间复杂度O(N),空间复杂度O(N)

    0 赞同 0 条回复
  • Jerry 普通 2024年11月29日 下午3:13
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> res;
            if(!root) return res;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                int sz = q.size();
                for(int i = 0; i < sz; i++){
                    TreeNode* tmp = q.front();
                    res.push_back(tmp->val);
                    q.pop();
                    if(tmp->left) q.push(tmp->left);
                    if(tmp->right) q.push(tmp->right);
                }
            }
            return res;
        }
    };
    

    时间o(n)
    空间o(n)
    通过队列实现非递归遍历

    0 赞同 0 条回复
  • Aatorx 永久会员 2024年11月29日 下午3:05
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> res;
            if(!root){
                return res;
            }
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                TreeNode* temp = q.front();
                res.push_back(temp->val);
                q.pop();
                if(temp->left != nullptr){
                    q.push(temp->left);
                }
                if(temp->right != nullptr){
                    q.push(temp->right);
                }
            }
            return res;
        }
    };
    

    时间复杂度O(N),空间复杂度O(N)。

    0 赞同 0 条回复
  • Renasc 普通 2024年11月29日 上午11:04

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

    class Solution {
        public int[] decorateRecord(TreeNode root) {
            // 如果为空,则返回空数组
            if (root == null) return new int[0];
    
            // 初始化
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
            ArrayList<Integer> answer = new ArrayList<>();
    
    
            // 对队列进行遍历
            while (!queue.isEmpty()) {
                TreeNode node = queue.poll();
                answer.add(node.val);
                if (node.left != null) queue.add(node.left);
                if (node.right != null) queue.add(node.right);
            }
    
            // 转数组
            int[] result = new int[answer.size()];
            for (int i=0; i<answer.size(); i++) {
                result[i] = answer.get(i);
            }
    
            // 返回结果
            return result;
        }
    }
    
    0 赞同 0 条回复
  • youngsir 普通 2024年11月29日 上午10:43

    打卡

    /**
     * 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:
        vector<int> decorateRecord(TreeNode* root) {
            vector<int> res;
            queue<TreeNode*> q;
            if(root == nullptr){
                return res;
            }
            q.push(root);
            while(!q.empty()){
                TreeNode* temp = q.front();
                q.pop();
                res.push_back(temp->val);
                if(temp->left){
                    q.push(temp->left);
                }
                if(temp->right){
                    q.push(temp->right);
                }
            }
            return res;
    
        }
    };
    
    0 赞同 0 条回复
  • 月下足迹 普通 2024年11月29日 上午10:39

    //需要一个辅助队列,每次弹出一个节点,输出他的值,并把他的左右孩子压入队列,直到队列为空
    class Solution {
    public int[] decorateRecord(TreeNode root) {
    Queue queue = new LinkedList<>();
    List arr = new ArrayList();

        int n = 0;
        if (root == null) {
            int [] zeroArr = new int [0]; 
            return  zeroArr;
        }else {
            queue.offer(root);
    
        }
    
    
        while (!queue.isEmpty()) {
            n++;
            TreeNode temp = queue.poll();
    
            if (temp.left != null) {
                queue.offer(temp.left);
            }
            if (temp.right != null) {
                queue.offer(temp.right);
            }
    
            arr.add(temp.val);
        }
    

    // int[] result = arr.stream().mapToInt(Integer::intValue).toArray();
    int [] result = new int [n];
    int i = 0;
    for (int j : arr) {
    result[i] = j;
    i++;
    }

        return result;
    
    
    }
    

    }

    0 赞同 0 条回复
  • 苯庸 普通 2024年11月29日 上午9:42

    class Solution {
    public int[] decorateRecord(TreeNode root) {
    if(root null) return new int[]{};
    Deque deque = new ArrayDeque();
    deque.offer(root);
    List list = new ArrayList();
    while(!deque.isEmpty()){
    int size = deque.size();
    while(size– > 0){
    TreeNode cur = deque.poll();
    list.add(cur.val);
    if(cur.left != null){
    deque.offer(cur.left);
    }
    if(cur.right != null){
    deque.offer(cur.right);
    }
    }
    }
    int[] res = new int[list.size()];
    for(int i = 0; i < res.length; i++){
    res[i] = list.get(i);
    }
    return res;
    }
    }
    层次遍历
    时间:O(n)
    空间:O(n)

    0 赞同 0 条回复
  • jaron 普通 2024年11月29日 上午9:01
    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if (root == null)
                return new int[0];
            Queue<TreeNode> q = new LinkedList<>();
            List<Integer> list = new ArrayList<>();
            q.add(root);
            while(!q.isEmpty()){
                TreeNode temp = q.poll();
                // 取的同时,有左加左,有右加右
                list.add(temp.val);
                if(temp.left != null) q.add(temp.left);
                if(temp.right != null) q.add(temp.right);
            }
            int[] res = new int[list.size()];
            for(int i = 0; i < list.size(); i++){
                res[i] = list.get(i);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • lQl 永久会员 2024年11月28日 下午10:35

    简单的队列层序遍历
    时间复杂度O(n)
    空间复杂度O(n)

    class Solution {
        public int[] decorateRecord(TreeNode root) {
            if(root == null)return new int[0];
            Queue<TreeNode> tree = new LinkedList<>();
            ArrayList<Integer> ans = new ArrayList<>();
            tree.offer(root);
            while(!tree.isEmpty()){
                if(tree.peek().left!=null)
                tree.offer(tree.peek().left);
                if(tree.peek().right!=null)
                tree.offer(tree.peek().right);
                ans.add(tree.poll().val);
            }
            int[] res = new int[ans.size()];
            for(int i = 0;i<ans.size();i++){
                res[i] = ans.get(i);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 晓宇 普通 2024年11月28日 下午10:17
    class Solution {
    public:
        vector<int> decorateRecord(TreeNode* root) {
            if(root == nullptr) return vector<int>();
            int head = 0;  // 队列游标,用于访问当前节点
            vector<TreeNode*> qT; // 存储节点的队列,用于层序遍历
            vector<int> ans; // 存输出值
            qT.push_back(root);
            while(head < qT.size()){
                TreeNode *node = qT[head];
                ans.push_back(node->val);
                if(node->left){
                    qT.push_back(node->left);
                }
                if(node->right){
                    qT.push_back(node->right);
                }
                head += 1;
            }
            return ans;
        }
    };
    思路:层序遍历,用队列辅助存储节点,用head游标表示当前访问的节点,列表顺序即是层序遍历顺序
    时间复杂度:o(n)
    空间复杂度:o(n)
    
    0 赞同 0 条回复
  • 秋山丽奈 普通 2024年11月28日 下午8:05

    思路: 使用 队列操作

    class Solution {
        public int[] decorateRecord(TreeNode root) {
            List<TreeNode> list = new ArrayList<>();
    
            list.add(root);
            int index = 0;
            TreeNode current = list.get(index);
            while(current != null){
                if(current.left != null){
                    list.add(current.left);
                }
    
                if(current.right != null){
                    list.add(current.right);
                }
    
                index ++;
                if(index == list.size()){
                    break;
                }
                current = list.get(index);
    
            }
    
            int[] ans = new int[index];
            for(int i = 0; i < index; i ++){
                ans[i] = list.get(i).val;
            }
    
            return ans;
    
        }
    }
    
    0 赞同 0 条回复
  • 迢迢星野 普通 2024年11月28日 下午8:01
    class Solution {
        /**
         * 一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照从 左 到 右 的顺序返回每一层彩灯编号。
         * 层序遍历
         *
         * @param root 根节点
         * @return 按层序遍历顺序返回的彩灯编号数组
         */
        public int[] decorateRecord(TreeNode root) {
            // 如果根节点为空,返回空数组
            if (root == null) {
                return new int[] {};
            }
    
            // 初始化队列,用于层序遍历
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(root);
    
            // 使用列表存储遍历结果
            List<Integer> list = new ArrayList<>();
    
            // 当队列不为空时,继续遍历
            while (!queue.isEmpty()) {
                // 获取当前层的节点数量
                int size = queue.size();
    
                // 遍历当前层的所有节点
                for (int i = 0; i < size; i++) {
                    // 从队列中取出一个节点
                    TreeNode node = queue.poll();
    
                    // 将节点的值添加到结果列表中
                    list.add(node.val);
    
                    // 如果左子节点不为空,将其加入队列
                    if (node.left != null) {
                        queue.offer(node.left);
                    }
                    // 如果右子节点不为空,将其加入队列
                    if (node.right != null) {
                        queue.offer(node.right);
                    }
                }
            }
    
            // 将列表转换为数组
            int[] result = new int[list.size()];
            for (int i = 0; i < list.size(); i++) {
                result[i] = list.get(i);
            }
    
            // 返回结果数组
            return result;
        }
    }
    

    思路:使用队列辅助存储二叉树节点,层序遍历逐层处理节点,并将节点值存储在集合中,最后转换为数组即可。
    时间复杂度:O(n),每个节点都需要遍历一次。
    空间复杂度:O(n),list 会存储所有的节点值。

    0 赞同 0 条回复

# 回答此问题

后才能回答