Question70:
二叉樹的層次遍歷
給出一棵二叉樹,返回其節點值從底向上的層次序遍歷
(按從葉節點所在層到根節點所在的層遍歷,然後逐層從左往右遍歷)
樣例
給一棵二叉樹 {3,9,20,#,#,15,7}
3
/ \
9 20
/ \
15 7
[
[15,7],
[9,20],
[3]
]
Solution:
BSF廣度優先算法,一層一層的進行遍歷
在上一個題的基礎上,倒序輸出就可以了
public class Q70_binaryTreeLevelOrderTraversal2 {
public List<List<Integer>> levelOrder(TreeNode root) {
// write your code here
if(root == null)
return null;
List<List<Integer>> result = new ArrayList<List<Integer>>();
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode current = null;
//根元素入隊
queue.offer(root);
while(!queue.isEmpty()) {
List<Integer> currentList = new ArrayList<Integer>();
//一層元素總數
int layerCount = queue.size();
//一次性出隊一層全部元素
while(layerCount-- != 0) {
//出隊頭元素並訪問
current = queue.poll();
currentList.add(current.val);
if(current.left != null) {
queue.offer(current.left);
}
if(current.right != null) {
queue.offer(current.right);
}
}
result.add(currentList);
}
//,再創建一個集合類,倒序取出,放入就可以了
/**
* 此處如果不可以使用集合類
* 1、如果對空間沒有要求,就再建一個集合類,倒序取放入新的集合類
* 2、如果對空間有限制,就用臨時變量temp,把result第一個和最後一個對調,依次,及完成反轉
*/
Collections.reverse(result);
return result;
}
@Test
public void test() {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(9);
root.right = new TreeNode(20);
root.right.left = new TreeNode(15);
root.right.right = new TreeNode(7);
List<List<Integer>> result = levelOrder(root);
System.out.println(result.toString());
}
}