【二叉树专题】多次被考察真题:剑指 Offer 32 – III. 从上到下打印二叉树

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

要求:

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

共以下 19 个回答

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

    void printBinaryTree(TreeNode* root, int layer) {
    if (root nullptr) {
    return;
    }
    if (layer
    1) {
    cout << root->val << ” “;
    } else if (layer % 2 1) {
    printBinaryTree(root->right, layer – 1);
    cout << root->val << ” “;
    } else {
    printBinaryTree(root->left, layer – 1);
    cout << root->val << ” “;
    }
    }//时间复杂度是 O(n),空间复杂度是 O(n)

    0 赞同 0 条回复
  • 黎明之前 普通 2023年9月8日 下午1:41

    //从上到下打印二叉树 呈之字形
    // 偶数从右到左 奇数从左到右
    //用II的改编
    //设定一个足够大的空间level(n) sum%2进行奇偶判断 将值传入
    class Solution{
    public:
    vector<vector> levelOrder(TreeNode *root)
    {
    vector<vector
    > res;
    if(root NULL)
    return NULL;
    queue q{{root}};
    int sum =1;
    while(!q.empty())
    {
    int n= q.size();
    vector level(n);
    for(int i =0;i<n;i++){
    auto t = q.front;
    q.pop();
    if(sum %2
    1)
    {
    level[i] = t->val;
    }
    else
    {
    level[n-i-1] = t->val;
    }
    if(t->left) q.push(t->left);
    if(t->right) q.push(t->right);
    }
    res.push_back(level);
    sum++
    }
    return res;
    };

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

    /**
    * 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);
    bool isorderleft = true; // 表示是否要从左往右遍历
    while (!que.empty()) {
    deque levelList; // 使用一个双端队列来存放当前层的节点元素
    int size = que.size();
    for (int i = 0; i < size; ++i) {
    auto node = que.front();
    que.pop();
    if (isorderleft) {
    levelList.emplace_back(node->val);
    } else {
    levelList.emplace_front(node->val);
    }
    if (node->left) que.emplace(node->left);
    if (node->right) que.emplace(node->right);
    }
    res.emplace_back(vector
    {levelList.begin(), levelList.end()});
    isorderleft = !isorderleft;
    }
    return res;
    }
    };

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

    时间复杂度: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);
    int k=1;
    while(!q.empty()){
    int n=q.size();
    vector vals(n);
    TreeNode
    t;
    for(int i=0;i<n;i++){
    t = q.front();
    if(k%20) vals[n-i-1]=t->val;
    else vals[i]=t->val;
    if(t->left!=NULL) q.push(t->left);
    if(t->right!=NULL) q.push(t->right);
    q.pop();
    }
    bfs.push_back(vals);
    k++;
    }
    return bfs;
    }
    };

    0 赞同 0 条回复
  • Marc 普通 2023年9月2日 下午8:50
    lass Solution:
        def levelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            queue = [root]
            res = []
            rev = False 
            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)
                if rev:
                    res.append(tmp[::-1])
                else:
                    res.append(tmp)
                rev = not rev 
            return res     
    

    时间On

    0 赞同 0 条回复
  • 辰北、 普通 2023年8月28日 下午6:46

    时间复杂度on,空间on
    /*对于这行代码 nodeQueue[right++] = root; ,根节点入队的意思是将根节点 root 存储在队列 nodeQueue 中的特定位置。
    nodeQueue 是一个存储节点的队列,通过数组来实现,right 是队列的右指针,表示队列的尾部位置。在这行代码中,nodeQueue[right++] 表达式的含义是先将根节点 root 存储在 nodeQueue 队列的 right 位置,然后将 right 的值增加1,指向下一个空闲的队列位置。
    根节点的 next 指针通常用于指向二叉树中下一个要访问的节点。如果你想实现后续根节点的入队操作,可以使用类似的语句,将 next 指向的节点存储在队列中的下一个位置。
    例如,假设你要将根节点的左子节点入队,可以使用以下代码:
    nodeQueue[right++] = root->left; // 左子节点入队

    这行代码将根节点的左子节点(如果存在)存储在队列 nodeQueue 的下一个位置,然后将 right 的值增加1,指向下一个空闲的队列位置。
    通过这种方式,你可以依次将二叉树中的节点按层次顺序入队,以实现层次遍历等操作。*/

    /**
    * Definition for a binary tree node.
    * struct TreeNode {
    * int val;
    * struct TreeNode *left;
    * struct TreeNode *right;
    * };
    */

    /**
    * Return an array of arrays of size *returnSize.
    * The sizes of the arrays are returned as *returnColumnSizes array.
    * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
    */
    #define N 2000 // 定义数组大小

    int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
    *returnSize = 0;

    if (root == NULL) {
        return NULL;
    }
    
    int** ans = malloc(sizeof(int*) * N);  // 分配存储结果的数组
    *returnColumnSizes = malloc(sizeof(int) * N);  // 分配存储每行元素个数的数组
    
    struct TreeNode* nodeQueue[N];  // 构建队列来存储节点
    int left = 0, right = 0;  // 队列左右指针
    nodeQueue[right++] = root;  // 根节点入队
    
    bool isOrderLeft = true;  // 控制遍历顺序的布尔变量
    
    while (left < right) {
        int levelList[N * 2];  // 存储当前层次的元素值的数组
        int front = N, rear = N;  // levelList的前后指针
        int size = right - left;  // 当前层次的节点数
    
        for (int i = 0; i < size; ++i) {
            struct TreeNode* node = nodeQueue[left++];  // 出队一个节点
    
            if (isOrderLeft) {
                levelList[rear++] = node->val;  // 根据遍历顺序将节点值存入levelList
            } else {
                levelList[--front] = node->val;
            }
    
            if (node->left) {
                nodeQueue[right++] = node->left;  // 左孩子入队
            }
            if (node->right) {
                nodeQueue[right++] = node->right;  // 右孩子入队
            }
        }
    
        // 将当前层次的元素值存入结果数组 ans
        int* tmp = malloc(sizeof(int) * (rear - front));
        for (int i = 0; i < rear - front; i++) {
            tmp[i] = levelList[i + front];
        }
    
        ans[*returnSize] = tmp;  // 将层次遍历结果存入 ans
        (*returnColumnSizes)[*returnSize] = rear - front;  // 存储当前层次的元素个数
        (*returnSize)++;  // 层数加1
        isOrderLeft = !isOrderLeft;  // 改变遍历顺序
    }
    
    return ans;  // 返回层次遍历结果
    

    }

    0 赞同 0 条回复
  • 小肸 永久会员 2023年8月28日 下午2:13
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            Deque<TreeNode> queue = new LinkedList<>();
            int level = 0;
            if (root != null) {
                level ++;
                queue.offer(root);
            }
            while (!queue.isEmpty()) {
                //当前层的节点数量
                int count = queue.size();
                List<Integer> tmp = new LinkedList<>();
                while (count -- > 0) {
                    TreeNode node = queue.poll();
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                    if (level % 2 != 0) {
                        //从左往右,尾插法
                        tmp.add(tmp.size(), node.val);
                    } else {
                        //从右往左,头插法
                        tmp.add(0, node.val);
                    }
                }
                res.add(tmp);
                level ++;
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • sc_Yang 普通 2023年8月26日 下午6:47

    加个顺便标识来控制输出的正反序

    /**
     * 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);
            bool flag = true;
            while(!que.empty()){
                // result.push_back(vector<int>());
                vector<int> tmp;
                int curLevSize = que.size();
                for(int i=0; i<curLevSize; ++i){
                    TreeNode* node = que.front();
                    que.pop();
                    tmp.push_back(node->val);
                    if(node->left) que.push(node->left);
                    if(node->right) que.push(node->right);    
                }
                if(flag){
                        result.push_back(tmp);
                }else{
                        reverse(tmp.begin(),tmp.end());
                        result.push_back(tmp);
                }
                flag = !flag;
            }
            return result;
        }
    };
    
    0 赞同 0 条回复
  • sincere 普通 2023年8月26日 下午4:39
    • 思路:层序遍历,每层循环利用一个LinkedList存储节点,通过list的size与2取模判断当前是奇数层还是偶数层,然后LinkedList对应addFirst或者addLast
    • 复杂度:时间复杂度O(n),空间复杂度O(n)
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> lists = new ArrayList<>();
            if (root == null) {
                return lists;
            }
            Queue<TreeNode> queue = new LinkedList<TreeNode>();
            queue.add(root);
            while (!queue.isEmpty()) {
                LinkedList<Integer> tmp = new LinkedList<>();
                for (int i = queue.size(); i > 0; i--) {
                    TreeNode node = queue.poll();
                    if (lists.size() % 2 == 0) {
                        tmp.addLast(node.val);
                    } else {
                        tmp.addFirst(node.val);
                    }
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                }
                lists.add(tmp);
            }
            return lists;
        }
    }
    
    0 赞同 0 条回复
  • Sheng 永久会员 2023年8月26日 下午4:22

    通过行数区别是从左到右打印还是从右到左打印

        //请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,
        //第二行按照从右到左的顺序打印,第三行再按照从左到右的顺序打印
        //其他行依次类推
        public List<List<Integer>> levelOrder(TreeNode root) {
            if(root == null) return new LinkedList<List<Integer>>();
    
            List<List<Integer>> result = new LinkedList<List<Integer>>();
            Queue<TreeNode> tmp = new LinkedList<TreeNode>();
    
            int line = 1;
            tmp.add(root);
            while(tmp.size()!=0) {
                LinkedList<Integer> level = new LinkedList<Integer>();//LinkedList才有addFirst头部插入元素的方法
                int size=tmp.size();
                for(int i=0; i<size; i++) {
                    TreeNode temp = tmp.remove();
                    if(line % 2 == 1) {
                        level.add(temp.val);
                    }
                    else {
                        level.addFirst(temp.val);
                    }
                    if(temp.left != null) tmp.add(temp.left);
                    if(temp.right != null) tmp.add(temp.right);
                }
                result.add(level);
                line++;
            }
            return result;
        }
    
    0 赞同 0 条回复
  • 木木 普通 2023年8月23日 上午9:25

    時間複雜度 : O(n)
    空間複查度: O(n) 最多有一半的節點儲存在隊列中
    一開始首先想到利用 flag來反轉儲存順序, 後來也是照這個思路寫出來
    其餘部分跟上一題差不多 也是層序遍歷的概念

    
    class Solution {
    public:
        vector> levelOrder(TreeNode* root) {
          queue q;
          vector> res;
          if (root == NULL) {
            return res;
          }
          q.push(root);
          int flag = 1;
          while(!q.empty()) {
            int q_size = q.size();
            vector level(q_size);
            for (int i = 0; i < q_size; i++) {
              TreeNode* temp = q.front();
              q.pop(); 
              if (flag % 2 == 1) {
                level[i] = temp->val;
              }
              else {
                level[q_size - i - 1] = temp->val;
              }       
              if (temp->left != NULL) {
                q.push(temp->left);
              } 
              if (temp->right != NULL) {
                q.push(temp->right);
              }
            }
            flag++;
            res.push_back(level);
          }
          return res;
        }
    };
    
    0 赞同 0 条回复
  • 木子有点甜🍒 普通 2023年8月22日 下午12:00

    第一反应就是对应的层直接倒序
    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
    
    0 赞同 0 条回复
  • 逸兴遄飞 普通 2023年8月22日 上午10:20

    使用标记位

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            if(root == null){
                return new ArrayList<>();
            }
            // 创建储值队列和返回队列
            Queue<TreeNode> queue = new LinkedList<>();
            List<List<Integer>> res = new ArrayList<>();
    
            int sum = 1;
            queue.add(root);
            // 遍历储值队列
            while(!queue.isEmpty()) {
                int k = queue.size();
                LinkedList<Integer> tmp = new LinkedList<>();
                // 对当前层数进行判断,并按照相应顺序填入tmp
                for(int i=0; i<k; i++){
                    TreeNode t = queue.poll();
                    if(sum % 2 == 1){
                        tmp.add(t.val);
                    } else {
                        tmp.addFirst(t.val);
                    }
                    if(t.left != null) queue.add(t.left);
                    if(t.right != null) queue.add(t.right);
                }
                res.add(tmp);
                sum++;
            }
    
            return res;
        }
    }
    
    0 赞同 0 条回复
  • 帝心引力 永久会员 2023年8月21日 下午9:14
    时间o(n), 空间o(n)
    vector<vector<int>> levelOrder(TreeNode* root) {
            if(root == NULL) return {};
            vector<vector<int>> ans;
            queue<TreeNode*> que;
            que.push(root);
            int level = 1; // 记录层数
    
            while(!que.empty()){
                deque<int> levelList; // 双端队列,可以从两端插入
                int n = que.size();
                for(int i=0; i<n; i++){
                    auto node = que.front();
                    if(level % 2 == 1){ // 奇数层
                        levelList.push_back(node->val);
                    }
                    else{ // 偶数层
                        levelList.push_front(node->val);
                    }
    
                    if(node->left) que.push(node->left);
                    if(node->right) que.push(node->right);
                    que.pop();
                }
                // 将双端队列转换为数组
                ans.emplace_back(vector<int>{levelList.begin(), levelList.end()});
                level++;
            }
    
            return ans;
        }
    
    0 赞同 0 条回复
  • JustRtn 普通 2023年8月21日 下午7:24

    // 偶数层倒序

    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);
    
            int level = 0;
            while (!que.empty()) {
                level++;
                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);
                }
                if (level % 2 == 0)
                    vv.push_back({v.rbegin(), v.rend()});
                else
                    vv.push_back(v);
                v.clear();
            }
    
            return vv;
        }
    };
    
    0 赞同 0 条回复
  • 别扒拉我 普通 2023年8月20日 下午10:30

    1、层次遍历。双端队列

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

    通过增加标记为来判断层序遍历时,节点值加在头还是尾

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

    增加标记位

    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
            Queue<TreeNode> queue = new LinkedList<>();
            List<List<Integer>> ans = new ArrayList<>();
            int sum = 1;
            queue.add(root);
            while (!queue.isEmpty()) {
                int k = queue.size();
                LinkedList<Integer> tmp = new LinkedList<>();
                for (int i = 0; i < k; i++) {
                    TreeNode p = queue.poll();
                    if (sum % 2 == 1) {
                        tmp.add(p.val);
                    } else {
                        tmp.addFirst(p.val);
                    }
    
                    if (p.left != null) {
                        queue.add(p.left);
                    }
                    if (p.right != null) {
                        queue.add(p.right);
                    }
                }
                ans.add(tmp);
                sum++;
            }
            return ans;
        }
    }
    
    0 赞同 0 条回复

# 回答此问题

后才能回答