22、從上往下打印二叉樹
題目描述:
從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
思路:
用隊列存儲節點。
import java.util.ArrayList;
/**
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> al = new ArrayList<>();
if(root==null){return al;}
ArrayList<TreeNode> queue = new ArrayList<>();//鏈表模擬隊列
queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.remove(0);//鏈表頭出隊
al.add(temp.val);
if(temp.left!=null){queue.add(temp.left);}
if(temp.right!=null){queue.add(temp.right);}
}
return al;
}
}
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
/**
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> al = new ArrayList<>();
if(root==null){return al;}
Deque<TreeNode> queue = new LinkedList<>();//使用雙端隊列
queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.remove();
al.add(temp.val);
if(temp.left!=null){queue.add(temp.left);}
if(temp.right!=null){queue.add(temp.right);}
}
return al;
}
}
雙端隊列:
線性集合,支持兩端的元素插入和移除。Deque是double ended queue
的簡稱。
Deque是一個接口interface Deque <E>
,子接口爲BlockingDeque <E>
。
實現類:
LinkedList
大小可變的鏈表雙端隊列,允許元素爲插入null(慎用,因爲null有時會作爲特殊的返回值)。ArrayDeque
大下可變的數組雙端隊列,不允許插入null。ConcurrentLinkedDeque
大小可變且線程安全的鏈表雙端隊列,非阻塞,不允許插入null。LinkedBlockingDeque
爲線程安全的雙端隊列,在隊列爲空的情況下,獲取操作將會阻塞,直到有元素添加。
注意:
LinkedList
和ArrayDeque
是線程不安全的容器。當多個線程同時使用的時候,需要程序員手動同步。
Queue Method | Equivalent Deque Method | 說明 |
---|---|---|
add(e) | addLast(e) | 向隊尾插入元素,失敗則拋出異常 |
offer(e) | offerLast(e) | 向隊尾插入元素,失敗則返回false |
remove() | removeFirst() | 獲取並刪除隊首元素,失敗則拋出異常 |
poll() | pollFirst() | 獲取並刪除隊首元素,失敗則返回null |
element() | getFirst() | 獲取但不刪除隊首元素,失敗則拋出異常 |
peek() | peekFirst() | 獲取但不刪除隊首元素,失敗則返回null |
Stack Method | Equivalent Deque Method | 說明 |
---|---|---|
push(e) | addFirst(e) | 向棧頂插入元素,失敗則拋出異常 |
無 | offerFirst(e) | 向棧頂插入元素,失敗則返回false |
pop() | removeFirst() | 獲取並刪除棧頂元素,失敗則拋出異常 |
無 | pollFirst() | 獲取並刪除棧頂元素,失敗則返回null |
peek() | peekFirst() | 獲取但不刪除棧頂元素,失敗則拋出異常 |
無 | peekFirst() | 獲取但不刪除棧頂元素,失敗則返回null |
注意:實現的是棧還是隊列是取決於元素入的時候是何種方式進入,如果是通過add或者addFirst方法進入的話,元素出的時候無論是remove還是pop還是removeFirst都實現的是一個隊列。