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

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

要求:

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

共以下 21 个回答

  • 谁仁 普通 2023年9月12日 下午4:18

    void printBinaryTree(TreeNode* root) {
    if (root nullptr) {
    return;
    }
    queue q;
    q.push(root);
    while (!q.empty()) {
    TreeNode* node = q.front();
    q.pop();
    cout << node->val << ” “;
    if (node->left) {
    q.push(node->left);
    }
    if (node->right) {
    q.push(node->right);
    }
    }
    }//时间复杂度为 O(2^h),空间复杂度为 O(2^h)

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

    使用层序遍历的思想
    /**
    * 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 levelOrder(TreeNode
    root) {
    vector res;
    if (root nullptr) return res;
    queue<TreeNode*> que; // 使用队列来存储当前层的节点
    que.emplace(root); // 将根节点入队
    while (!que.empty()) {
    int size = que.size(); // 表示当前层的节点数量
    for (int i = 1; i <= size; ++i) {
    auto node = que.front();
    que.pop();
    res.emplace_back(node->val);
    if (node->left) que.emplace(node->left);
    if (node->right) que.emplace(node->right);
    }
    }
    return res;
    }
    };

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

    打卡

    /**
     * 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<int> levelOrder(TreeNode* root) {
            vector<int> res;
            if(root == NULL) return res;
    
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                TreeNode * x = q.front();
                res.push_back(x->val);
                q.pop();
                if(x->left != NULL) q.push(x->left);
                if(x->right != NULL) q.push(x->right);
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 黎明之前 普通 2023年9月4日 下午1:26

    创建一个队列和数组,
    队头等于root
    后面循环,队列先进左再进右,存入数组res;
    class Solution {
    public:
    vector levelOrder(TreeNode* root) {
    vector
    res;//存储结果
    if(!root )
    return res;
    queue <TreeNode*> q{{root}};
    while(!q.empty())
    {
    auto t = q.front();
    q.pop();
    res.push_back(t->val);
    if(t->left)
    {
    q.push(t->left);
    }
    if(t->right)
    {
    q.push(t->right);

            }
        }
        return res;
    }
    

    };

    0 赞同 0 条回复
  • Marc 普通 2023年9月2日 下午8:44
        def levelOrder(self, root: TreeNode) -> List[int]:
            if not root:
                return [] 
    
            queue = [root]
            res = [] 
            while queue:
                size = len(queue)
                for i in range(size):
                    cur = queue.pop(0)
                    res.append(cur.val)
                    if cur.left:
                        queue.append(cur.left)
                    if cur.right:
                        queue.append(cur.right)
            return res 
    

    时间On

    0 赞同 0 条回复
  • 💮黧大王.exe 普通 2023年8月30日 下午11:57

    时间复杂度: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 levelOrder(TreeNode
    root) {
    vector bfs;
    queue<TreeNode> q;
    if(rootNULL) return {};
    q.push(root);
    while(!q.empty()){
    TreeNode
    t = q.front();
    bfs.push_back(t->val);
    if(t->left!=NULL) q.push(t->left);
    if(t->right!=NULL) q.push(t->right);
    q.pop();
    }
    return bfs;
    }
    };

    0 赞同 0 条回复
  • 小肸 永久会员 2023年8月28日 下午12:51
    class Solution {
        public int[] levelOrder(TreeNode root) {
            Deque<TreeNode> queue = new LinkedList<>();
            List<Integer> res = new ArrayList<>();
            if (root != null) {
                queue.offer(root);
            }
            while (!queue.isEmpty()) {
                TreeNode node = queue.poll();
                res.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            //stream流处理将List<Integer>转换成int[]
            return res.stream().mapToInt(Integer::valueOf).toArray();
        }
    }
    
    0 赞同 0 条回复
  • sc_Yang 普通 2023年8月26日 下午5:35

    利用队列实现层序遍历

    /**
     * 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<int> levelOrder(TreeNode* root) {
            if(root==NULL){
                return {};
            }
            vector<int > result;
            queue<TreeNode*> que;
            que.push(root);
            while(!que.empty()){
                TreeNode* node = que.front();
                que.pop();
                result.push_back(node->val);
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
            }
            return result;
        }
    };
    
    0 赞同 0 条回复
  • Sheng 永久会员 2023年8月26日 下午2:16

    利用队列辅助

        //从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印
        public Queue<Integer> result;
        public Queue<TreeNode> tmp;
        public int[] levelOrder(TreeNode root) {
            if(root == null) return new int[0];
    
            Queue<Integer> result = new LinkedList<Integer>();
            Queue<TreeNode> tmp = new LinkedList<TreeNode>();
    
            tmp.add(root);
    
            while(tmp.size()!=0) {
                int size=tmp.size();
                for(int i=0; i<size; i++) {
                    TreeNode temp = tmp.remove();
                    result.add(temp.val);
                    if(temp.left != null) tmp.add(temp.left);
                    if(temp.right != null) tmp.add(temp.right);
                }
            }
    
            int size = result.size();
            int[] arr = new int[size];
            for(int i=0; i<size; i++) {
                arr[i] = result.remove();
            }
            return arr;
        }
    
    0 赞同 0 条回复
  • sincere 普通 2023年8月26日 上午1:07
    • 思路:层序遍历
    • 复杂度:时间复杂度O(n),空间复杂度O(n)
    class Solution {// 层序遍历
    
        public int[] levelOrder(TreeNode root) {
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            List<Integer> list = new ArrayList<>();
            if (root == null) {
                return new int[0];
            }
            queue.add(root);
            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[] arr = new int[list.size()];
            for (int i = 0; i < list.size(); i++) {
                arr[i] = list.get(i);
            }
            return arr;
        }
    }
    
    0 赞同 0 条回复
  • 辰北、 普通 2023年8月23日 下午4:27

    是时间复杂度ON,空间复杂度on
    创建一个队列和数组,第一次用memest(指针;数值;大小(存储单位大小),
    队头等于root
    后面循环,队列先进左再进右,存入数组ans;

    ““#include<stido.h>

    从上到下按层打印二叉树
    int* levelOrder(struct TreeNode* root, int* returnSize) {
    *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;  // 将根节点入队
    

    queue[tail++] = root; 这个语句将根节点的指针存储到队列数组 queue 中,而不是存储根节点的所有值。
    while (head < tail) { // 当队列非空时循环
    struct TreeNode* temp = queue[head++]; // 取出队首节点指针

        ans[(*returnSize)++] = temp->val;  // 将节点值存入结果数组中
    
        if (temp->left != NULL) {
            queue[tail++] = temp->left;  // 如果有左子节点,将左子节点入队
        }
        if (temp->right != NULL) {
            queue[tail++] = temp->right;  // 如果有右子节点,将右子节点入队
        }
    }
    
    return ans;  // 返回存储结果的数组指针
    

    }

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

    時間複雜度 O(n) 空間複雜度 O(n)
    用一個隊列來儲存要處理的node 再用另一個vector來儲存要打印的值

    
    class Solution {
    public:
    
        vector levelOrder(TreeNode* root) {
          if (root == NULL) return {};
          vector res;
          queue q;
    
          q.push(root);
          while (!q.empty()) {
            TreeNode* curr = q.front();
            q.pop();
            res.push_back(curr->val);
            if (curr->left) q.push(curr->left);
            if (curr->right) q.push(curr->right);
          }
          return res;
        }
    };
    
    0 赞同 0 条回复
  • 帝心引力 永久会员 2023年8月21日 下午8:46
    时间o(n), 空间o(n)
    vector<int> levelOrder(TreeNode* root) {
            if(root == NULL) return vector<int>{};
    
            vector<int> ans;
            // 用一个队列存储节点
            queue<TreeNode*> qu;
            qu.push(root);
    
            while(!qu.empty()){
                ans.emplace_back(qu.front()->val);
                if(qu.front()->left) qu.push(qu.front()->left);
                if(qu.front()->right) qu.push(qu.front()->right);
                qu.pop();
            }
    
            return ans;
        }
    
    0 赞同 0 条回复
  • JustRtn 普通 2023年8月21日 下午6:37

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

    class Solution {
    public:
        vector<int> levelOrder(TreeNode* root) {
            if (root == nullptr) {
                return {};
            }
            vector<int> v;
            std::queue<TreeNode*> que;
            que.push(root);
    
            TreeNode* node;
            while (!que.empty()) {
                node = que.front();
                que.pop();
                v.push_back(node->val);
                if (node->left)
                    que.push(node->left);
                if (node->right)
                    que.push(node->right);
            }
    
            return v;
        }
    };
    
    0 赞同 0 条回复
  • 逸兴遄飞 普通 2023年8月21日 下午3:18

    层序遍历

    • 时间复杂度O(N);
    • 空间复杂度O(N);
    class Solution {
        public int[] levelOrder(TreeNode root) {
            if(root == null) return new int[0];
            // 创建包含根节点的队列
            Queue queue = new LinkedList<>(){{ add(root); }};
            // 创建存储中间值的数组
            ArrayList res = new ArrayList<>();
            // 使用while循环,对所有节点依次遍历
            while(!queue.isEmpty()) {
                TreeNode node = queue.poll();
                res.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            // 将结果放到int数组中输出
            int[] result = new int[res.size()];
            for(int i = 0; i < res.size(); i++) {
                result[i] = res.get(i);
            }
            return result; 
        }
    }
    
    1 赞同 0 条回复
  • 海浪漂哇漂 普通 2023年8月20日 下午11:44

    打卡

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

    层序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int[] levelOrder(TreeNode root) {
            if (root==null){
                return new int[0];
            }
            List<Integer> res = new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            int size;
            TreeNode node;
            while (!queue.isEmpty()){
                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);
                    }
                    res.add(node.val);    
                }
            }
            int[] arr = new int[res.size()];
            for (int i = 0; i < res.size(); i++) {
                arr[i] = res.get(i);
            }
    
            return arr;
        }
    }
    
    0 赞同 0 条回复
  • 木子有点甜🍒 普通 2023年8月20日 下午8:16

    class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
    #对于每个节点,先入队列,然后出队列时将这个节点的左节点、右节点入队列。
    if not root: return []

        treedeque = collections.deque()
        tree = []
        treedeque.append(root)#先入队列
    
        while treedeque:
            tmp = treedeque.popleft()#然后出队列
            tree.append(tmp.val)
    
            if tmp.left:#出队列时入其左节点,右节点
                treedeque.append(tmp.left)
            if tmp.right:
                treedeque.append(tmp.right)
    
        return tree
    
    0 赞同 0 条回复
  • 别扒拉我 普通 2023年8月20日 下午7:38

    1、层次遍历

    class Solution {
        public int[] levelOrder(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 tmp = queue.poll();
                ans.add(tmp.val);
                if(tmp.left != null){
                    queue.add(tmp.left);
                }
                if(tmp.right != null){
                    queue.add(tmp.right);
                }
            }
            int[] res = new int[ans.size()];
            for(int i=0; i<ans.size(); i++){
                res[i] = ans.get(i);
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 行动派小彩笔 普通 2023年8月20日 下午4:55
    // 层次遍历,时间复杂度O(n),空间复杂度O(n)
    class Solution {
    public:
        vector<int> levelOrder(TreeNode* root) {
            vector<int> vec;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty())
            {
                TreeNode *node = q.front();
                q.pop();
                if(!node) continue;
                vec.push_back(node->val);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            return vec;
        }
    };
    
    0 赞同 0 条回复
  • 塔底的仰望 永久会员 2023年8月20日 下午4:18

    层序遍历
    时间复杂度O(n)空间复杂度O(n)

    class Solution {
        public int[] levelOrder(TreeNode root) {
            if (root == null) {
                return new int[0];
            }
            List<Integer> list = new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                TreeNode p = queue.poll();
                list.add(p.val);
                if (p.left != null) {
                    queue.add(p.left);
                }
                if (p.right != null) {
                    queue.add(p.right);
                }
            }
            return list.stream().mapToInt(Integer::intValue).toArray();
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答