1. 力扣102 : 二叉樹的層序遍歷
(1). 題
給你二叉樹的根節點?root
?,返回其節點值的?層序遍歷?。 (即逐層地,從左到右訪問所有節點)。
示例 1:
?
輸入:root = [3,9,20,null,null,15,7] 輸出:[[3],[9,20],[15,7]]
示例 2:
輸入:root = [1] 輸出:[[1]]
示例 3:
輸入:root = [] 輸出:[]
提示:
- 樹中節點數目在范圍?
[0, 2000]
?內 -1000 <= Node.val <= 1000
(2). 思路
由題,可知方法返回一個集合,該集合的元素仍然是一個集合. 該題需要用到隊列數據結構.如果二叉樹是空樹,直接返回空集合. 如果不是,則將根節點入隊.由于根節點在隊列中,將size初始化為1,n的作用則是用于更新size.while循環,只要隊列不為空,那么就new一個集合,for循環依次出隊,并將出隊的節點的值add到集合中收集起來,如果其有左孩子或右孩子,則將該孩子節點入隊,并將n++. 一次循環結束時,將小集合add入大集合中.
(3). 解
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> bl = new ArrayList<>();Deque<TreeNode> deque = new LinkedList<>();if(root == null) {return bl;}deque.offer(root);int size = 1;int n = 0;//只要隊列不為空while(!deque.isEmpty()) {List<Integer> l = new ArrayList<>();for(int i =0 ; i < size; i++) {TreeNode tn = deque.poll();l.add(tn.val);if(tn.left != null) {deque.offer(tn.left);n++;}if(tn.right != null) {deque.offer(tn.right);n++;}}size = n;n = 0;bl.add(l);}return bl;}
}
2. 力扣107 : 二叉樹的層序遍歷2
(1). 題
給你二叉樹的根節點?root
?,返回其節點值?自底向上的層序遍歷?。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
?
示例 1:
?
輸入:root = [3,9,20,null,null,15,7] 輸出:[[15,7],[9,20],[3]]
示例 2:
輸入:root = [1] 輸出:[[1]]
示例 3:
輸入:root = [] 輸出:[]
提示:
- 樹中節點數目在范圍?
[0, 2000]
?內 -1000 <= Node.val <= 1000
(2). 思路
該題與力扣102題同源,只不過最后處理的時候多了一個出棧入棧的操作而已. 所以完全可以將102題的代碼復制粘貼過來,然后添加一個棧結構,while循環中,不是直接將小集合添加到大集合中,而是做一個壓棧的操作.while循環結束以后,將棧中元素全部彈出,add入大集合,將其返回即可.
(3). 解
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> bl = new ArrayList<>();Deque<TreeNode> deque = new LinkedList<>();Deque<List<Integer>> stack = new LinkedList<>();if(root == null) {return bl;}deque.offer(root);int size = 1;int n = 0;//只要隊列不為空while(!deque.isEmpty()) {List<Integer> l = new ArrayList<>();for(int i =0 ; i < size; i++) {TreeNode tn = deque.poll();l.add(tn.val);if(tn.left != null) {deque.offer(tn.left);n++;}if(tn.right != null) {deque.offer(tn.right);n++;}}size = n;n = 0;stack.push(l);}while(!stack.isEmpty()) {bl.add(stack.pop());}return bl;}
}