二叉樹層序遍歷問題總結
阿新 • • 發佈:2020-08-13
主要內容:
- 不分行從上到下列印二叉樹
- 分行從上到下列印二叉樹
- 分行從下到上列印二叉樹
- 之字形列印二叉樹
- 二叉樹的右檢視
1. 不分行從上到下列印二叉樹
題目描述:從上到下打印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。
相關題目:劍指22;劍指18;
程式碼實現:
import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/ // 即二叉樹的層序遍歷(藉助佇列結構) public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList<Integer> list = new ArrayList<>(); if(root == null) return list; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root);//根節點入隊 while(!queue.isEmpty()){ TreeNode curr = queue.poll(); list.add(curr.val); if(curr.left != null) queue.offer(curr.left); if(curr.right != null) queue.offer(curr.right); } return list; } }
2.分行從上到下列印二叉樹
題目描述:從上到下按層列印二叉樹,同一層的節點按照從左到右的順序列印,每一層列印到一行 。
相關題目:LeetCode102;
程式碼實現:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.Queue; import java.util.LinkedList; import java.util.ArrayList; 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.offer(root); while(!queue.isEmpty()){ int levelnums = queue.size(); //計算每層的結點數目 List<Integer> list = new ArrayList<>(); for(int i = 0; i < levelnums; i++){ TreeNode cur = queue.poll(); list.add(cur.val); if(cur.left != null) queue.offer(cur.left); if(cur.right != null) queue.offer(cur.right); } res.add(list); } return res; } }
3.分行從下到上列印二叉樹
題目描述:給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
相關題目:LeetCode107;
程式碼實現:題目要求從下到上,只需要改變res.add(E e)方式,改為res.add(int index, E e)
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ int levelNums = queue.size(); List<Integer> list = new ArrayList<>(); for(int i = 0; i < levelNums; i++){ TreeNode cur = queue.poll(); list.add(cur.val); if(cur.left != null) queue.offer(cur.left); if(cur.right != null) queue.offer(cur.right); } res.add(0,list); //輸出是從上到下 還是 從下到上的關鍵 } return res; } }
4.之字形列印二叉樹
題目描述:之字形,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,以此類推。
相關題目:LeetCode103;
程式碼實現:有了前面兩題的基礎,這個題就好解決了。只需要記錄一下層數,分情況使用ArrayList.add(E e)和ArrayList.add(int index, E e)。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if(root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int level = 1; //初始化為第一層 while(!queue.isEmpty()){ int levelNums = queue.size(); List<Integer> list = new ArrayList<>(); for(int i = 0; i < levelNums; i++){ TreeNode cur = queue.poll(); // 判斷條件 (level & 1) 必須加括號 if((level & 1) == 1){ //奇數層 list.add(cur.val); }else{ //偶數層 list.add(0,cur.val); } if(cur.left != null) queue.offer(cur.left); if(cur.right != null) queue.offer(cur.right); } res.add(list); level++; //更新層數 } return res; } }
5.二叉樹的右檢視
題目描述:給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。
相關題目:LeetCode199;
程式碼實現:只將每層最後一個節點的值新增到ArrayList中返回。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; class Solution { public List<Integer> rightSideView(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root == null) return list; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while(!queue.isEmpty()){ int levelNums = queue.size(); for(int i = 0; i < levelNums; i++){ TreeNode cur = queue.poll(); if(i == levelNums - 1) list.add(cur.val); if(cur.left != null) queue.offer(cur.left); if(cur.right != null) queue.offer(cur.right); } } return list; } }
時間複雜度,空間複雜度
參考:
☆☆☆LeetCode二叉樹的層序遍歷系列問題總結(佇列實現)https://blog.csdn.net/u014116780/article/details/82978934