自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊從上到下打印二叉樹

開發(fā) 前端
最差情況下,即當樹為平衡二叉樹時,最多有 N/2 個樹節(jié)點同時在 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

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

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

返回:

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

提示:節(jié)點總數(shù) <= 1000

解題思路:

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

算法流程:

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

復雜度分析:

  1. 時間復雜度 O(N): N為二叉樹的節(jié)點數(shù)量,即 BFS 需循環(huán) N次。
  2. 空間復雜度 O(N) :最差情況下,即當樹為平衡二叉樹時,最多有 N/2 個樹節(jié)點同時在 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.  * @個人網(wǎng)站 www.nateshao.cn 
  10.  * @博客 https://nateshao.gitee.io 
  11.  * @GitHub https://github.com/nateshao 
  12.  * @Gitee https://gitee.com/nateshao 
  13.  * Description: 從上到下打印二叉樹 思路:利用隊列(鏈表)輔助實現(xiàn)。 
  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];//空樹則返回空數(shù)組 
  34.         ArrayList<Integer> list = new ArrayList<>();// 申請一個動態(tài)數(shù)組 ArrayList 動態(tài)添加節(jié)點值 
  35.         Queue<TreeNode> queue = new LinkedList<>(); 
  36.         queue.offer(root);// 根結(jié)點先入隊 
  37.         while (!queue.isEmpty()) { 
  38.             TreeNode node = queue.poll();// 取出當前隊首元素 
  39.             list.add(node.val); 
  40.             if (node.left != null) queue.offer(node.left);// 左子節(jié)點入隊 
  41.             if (node.right != null) queue.offer(node.right);// 右子節(jié)點入隊 
  42.         } 
  43.         // 將 ArrayList 轉(zhuǎn)為 int數(shù)組并返回 
  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

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

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

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

返回其層次遍歷結(jié)果:

  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

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

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

返回其層次遍歷結(jié)果:

  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.             // 打印奇數(shù)層 
  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.                 // 先左后右加入下層節(jié)點 
  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.             // 打印偶數(shù)層 
  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.                 // 先右后左加入下層節(jié)點 
  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

責任編輯:武曉燕 來源: 程序員千羽
相關(guān)推薦

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-10-12 09:25:11

二叉樹樹形結(jié)構(gòu)

2021-11-28 23:54:28

子樹B結(jié)構(gòu)

2024-05-22 09:23:03

CSSgrid布局前端

2021-09-29 10:19:00

算法平衡二叉樹

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2023-02-01 07:27:46

序列化二叉樹根節(jié)點

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2021-03-22 08:23:29

LeetCode二叉樹節(jié)點

2021-08-27 11:36:44

二叉樹回溯節(jié)點

2023-05-08 15:57:16

二叉樹數(shù)據(jù)結(jié)構(gòu)

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-05-06 17:46:30

二叉樹數(shù)據(jù)結(jié)構(gòu)

2021-12-17 14:26:58

二叉樹節(jié)點數(shù)量

2021-09-15 07:56:32

二叉樹層次遍歷

2021-07-13 14:03:24

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

51CTO技術(shù)棧公眾號