成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊從上到下打印二叉樹

開發 前端
最差情況下,即當樹為平衡二叉樹時,最多有 N/2 個樹節點同時在 queue 中,使用 O(N) 大小的額外空間。

 [[438363]]

Leetcode :

  • I:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof
  • II:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof
  • III:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof

“GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_25_levelOrder/Solution.java

從上到下打印二叉樹 I

“題目描述 :從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序打印。例如:給定二叉樹: [3,9,20,null,null,15,7],

  1.      3 
  2.     / \ 
  3.   9  20 
  4.  /  \ 
  5. 15   7 

返回:

  1. [3,9,20,15,7] 

提示:節點總數 <= 1000

解題思路:

  • 題目要求的二叉樹的 從上至下 打印(即按層打印),又稱為二叉樹的 廣度優先搜索(BFS)。
  • BFS 通常借助 隊列 的先入先出特性來實現。

算法流程:

  • 特例處理: 當樹的根節點為空,則直接返回空列表 [] ;
  • 初始化: 打印結果列表 res = [] ,包含根節點的隊列 queue = [root] ;
  • BFS 循環: 當隊列 queue 為空時跳出;
    • 出隊: 隊首元素出隊,記為 node;
    • 打印: 將 node.val 添加至列表 tmp 尾部;
    • 添加子節點: 若 node 的左(右)子節點不為空,則將左(右)子節點加入隊列 queue ;
  • 返回值: 返回打印結果列表 res 即可。

復雜度分析:

  1. 時間復雜度 O(N): N為二叉樹的節點數量,即 BFS 需循環 N次。
  2. 空間復雜度 O(N) :最差情況下,即當樹為平衡二叉樹時,最多有 N/2 個樹節點同時在 queue 中,使用 O(N) 大小的額外空間。
  1. package com.nateshao.sword_offer.topic_25_levelOrder; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.LinkedList; 
  5. import java.util.Queue; 
  6. /** 
  7.  * @date Created by 邵桐杰 on 2021/11/29 14:57 
  8.  * @微信公眾號 程序員千羽 
  9.  * @個人網站 www.nateshao.cn 
  10.  * @博客 https://nateshao.gitee.io 
  11.  * @GitHub https://github.com/nateshao 
  12.  * @Gitee https://gitee.com/nateshao 
  13.  * Description: 從上到下打印二叉樹 思路:利用隊列(鏈表)輔助實現。 
  14.  * 
  15.  * add 增加一個元索 如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常 
  16.  * remove 移除并返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常 
  17.  * element 返回隊列頭部的元素 如果隊列為空,則拋出一個NoSuchElementException異常 
  18.  * offer 添加一個元素并返回true 如果隊列已滿,則返回false 
  19.  * poll 移除并返問隊列頭部的元素 如果隊列為空,則返回null 
  20.  * peek 返回隊列頭部的元素 如果隊列為空,則返回null 
  21.  * put 添加一個元素 如果隊列滿,則阻塞 
  22.  * take 移除并返回隊列頭部的元素 如果隊列為空,則阻塞 
  23.  */ 
  24. public class Solution { 
  25.  
  26.     /** 
  27.      *  隊列 
  28.      * 
  29.      * @param root 
  30.      * @return 
  31.      */ 
  32.     public int[] levelOrder(TreeNode root) { 
  33.         if (root == nullreturn new int[0];//空樹則返回空數組 
  34.         ArrayList<Integer> list = new ArrayList<>();// 申請一個動態數組 ArrayList 動態添加節點值 
  35.         Queue<TreeNode> queue = new LinkedList<>(); 
  36.         queue.offer(root);// 根結點先入隊 
  37.         while (!queue.isEmpty()) { 
  38.             TreeNode node = queue.poll();// 取出當前隊首元素 
  39.             list.add(node.val); 
  40.             if (node.left != null) queue.offer(node.left);// 左子節點入隊 
  41.             if (node.right != null) queue.offer(node.right);// 右子節點入隊 
  42.         } 
  43.         // 將 ArrayList 轉為 int數組并返回 
  44.         int[] res = new int[list.size()]; 
  45.         for (int i = 0; i < res.length; i++) { 
  46.             res[i] = list.get(i); 
  47.         } 
  48.         return res; 
  49.     } 
  50.  
  51.     /************ 遞歸 *************/ 
  52.     public ArrayList<Integer> PrintFromTopToBottom2(TreeNode root) { 
  53.         ArrayList<Integer> list = new ArrayList<Integer>(); 
  54.         if (root == null) { 
  55.             return list; 
  56.         } 
  57.         list.add(root.val); 
  58.         levelOrder(root, list); 
  59.         return list; 
  60.     } 
  61.     public void levelOrder(TreeNode root, ArrayList<Integer> list) { 
  62.         if (root == null) { 
  63.             return
  64.         } 
  65.         if (root.left != null) { 
  66.             list.add(root.left.val); 
  67.         } 
  68.         if (root.right != null) { 
  69.             list.add(root.right.val); 
  70.         } 
  71.         levelOrder(root.left, list); 
  72.         levelOrder(root.right, list); 
  73.     } 
  74.  
  75.     public class TreeNode { 
  76.         int val; 
  77.         TreeNode left
  78.         TreeNode right
  79.  
  80.         TreeNode(int x) { 
  81.             val = x; 
  82.         } 
  83.     } 

從上到下打印二叉樹 II

題目描述 :從上到下按層打印二叉樹,同一層的節點按從左到右的順序打印,每一層打印到一行。

“例如:給定二叉樹: [3,9,20,null,null,15,7],

  1.      3 
  2.     / \ 
  3.    9  20 
  4.  /  \ 
  5. 15   7 

返回其層次遍歷結果:

  1.   [3], 
  2.   [9,20], 
  3.   [15,7] 

  1. public List<List<Integer>> levelOrder(TreeNode root) { 
  2.         Queue<TreeNode> queue = new LinkedList<>(); 
  3.         List<List<Integer>> res = new ArrayList<>(); 
  4.         if(root != null) queue.add(root); 
  5.         while(!queue.isEmpty()) { 
  6.             List<Integer> tmp = new ArrayList<>(); 
  7.             for(int i = queue.size(); i > 0; i--) { 
  8.                 TreeNode node = queue.poll(); 
  9.                 tmp.add(node.val); 
  10.                 if(node.left != null) queue.add(node.left); 
  11.                 if(node.right != null) queue.add(node.right); 
  12.             } 
  13.             res.add(tmp); 
  14.         } 
  15.         return res; 

III. 從上到下打印二叉樹 III

“題目描述: 請實現一個函數按照之字形順序打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右到左的順序打印,第三行再按照從左到右的順序打印,其他行以此類推。例如: 給定二叉樹: [3,9,20,null,null,15,7],

  1.   3 
  2.  / \ 
  3. 9  20 
  4.   /  \ 
  5.  15   7 

返回其層次遍歷結果:

  1.   [3], 
  2.   [20,9], 
  3.   [15,7] 
  1. class Solution { 
  2.     public List<List<Integer>> levelOrder(TreeNode root) { 
  3.         Deque<TreeNode> deque = new LinkedList<>(); 
  4.         List<List<Integer>> res = new ArrayList<>(); 
  5.         if(root != null) deque.add(root); 
  6.         while(!deque.isEmpty()) { 
  7.             // 打印奇數層 
  8.             List<Integer> tmp = new ArrayList<>(); 
  9.             for(int i = deque.size(); i > 0; i--) { 
  10.                 // 從左向右打印 
  11.                 TreeNode node = deque.removeFirst(); 
  12.                 tmp.add(node.val); 
  13.                 // 先左后右加入下層節點 
  14.                 if(node.left != null) deque.addLast(node.left); 
  15.                 if(node.right != null) deque.addLast(node.right); 
  16.             } 
  17.             res.add(tmp); 
  18.             if(deque.isEmpty()) break; // 若為空則提前跳出 
  19.             // 打印偶數層 
  20.             tmp = new ArrayList<>(); 
  21.             for(int i = deque.size(); i > 0; i--) { 
  22.                 // 從右向左打印 
  23.                 TreeNode node = deque.removeLast(); 
  24.                 tmp.add(node.val); 
  25.                 // 先右后左加入下層節點 
  26.                 if(node.right != null) deque.addFirst(node.right); 
  27.                 if(node.left != null) deque.addFirst(node.left); 
  28.             } 
  29.             res.add(tmp); 
  30.         } 
  31.         return res; 
  32.     } 

參考連接:

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/solution/mian-shi-ti-32-i-cong-shang-dao-xia-da-yin-er-ch-4

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/solution/mian-shi-ti-32-ii-cong-shang-dao-xia-da-yin-er-c-5

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/mian-shi-ti-32-iii-cong-shang-dao-xia-da-yin-er--3

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2021-10-12 09:25:11

二叉樹樹形結構

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-11-28 23:54:28

子樹B結構

2024-05-22 09:23:03

CSSgrid布局前端

2023-02-01 07:27:46

序列化二叉樹根節點

2021-09-29 10:19:00

算法平衡二叉樹

2013-07-15 16:35:55

二叉樹迭代器

2021-03-17 08:19:22

二叉樹LeetCode

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-04-28 20:12:27

數據結構創建

2021-08-27 11:36:44

二叉樹回溯節點

2021-03-22 08:23:29

LeetCode二叉樹節點

2023-05-08 15:57:16

二叉樹數據結構

2022-10-26 23:58:02

二叉樹數組算法

2021-05-06 17:46:30

二叉樹數據結構

2021-09-02 11:31:28

二叉搜索樹迭代法公共祖先

2021-09-15 07:56:32

二叉樹層次遍歷

2021-07-13 14:03:24

二叉樹滿二叉樹完全二叉樹
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久免费观看 | 国产成人精品区一区二区不卡 | 免费亚洲网站 | 国产精品久久久久久久久久 | 黄色网址免费在线观看 | 91网站在线播放 | 免费在线成人 | 久久久久久久久久久久久久久久久久久久 | 国产1区2区在线观看 | 亚洲一卡二卡 | 久久精品小视频 | 91中文字幕在线观看 | 久久久久久亚洲精品 | 精品熟人一区二区三区四区 | 国产精品a一区二区三区网址 | 久久久蜜臀国产一区二区 | 天天曰天天曰 | 美女黄视频网站 | 播放一级毛片 | 国产婷婷色综合av蜜臀av | 视频一区二区在线观看 | 免费国产视频在线观看 | 久久丝袜 | 日本三级黄视频 | 国产精品成人一区二区三区夜夜夜 | 搞av.com| 91在线一区二区三区 | 视频一区二区三区中文字幕 | 成人在线不卡 | av黄色在线 | 成人精品一区亚洲午夜久久久 | av网站免费观看 | 欧美亚洲视频 | 色影视| 国产四区 | 伊人影院99| 久久精品久久久 | 久久aⅴ乱码一区二区三区 91综合网 | 免费一级做a爰片久久毛片潮喷 | 妞干网av | 国产精品一区一区 |