這道題目難度一般,重要的是想到以隊列作爲輔助來解決。
分析:因爲按層打印的順序決定了先打印的應該爲根結點。爲了接下來能夠打印值爲 8 的結點的兩個子結點,應該在遍歷到該結點時把值爲 6 和 10 的兩個結點保存到一個容器裏,此時容器中含有 6 和 10 兩個結點。按照從左到右的要求,先取出值爲 6 的結點。打印出值 6 之後分別把 5 和 7 兩個左右子結點放入容器 ,此時容器中的結點有三個,分別是10 、 5 和 7 。接下來我們從容器中取出值爲 10 的結點,注意到 10 比另外兩個元素先進入,因此先將 10 取出,並再把 10 的兩個結點放入,此時容器中的元素爲 5 、 7 、 9 、 11。由此可以看出取元素的順序符合先進先出原則,我們則判斷需要通過隊列來解決這個問題。由於這四個結點都沒有子結點,因此只需要依次打印即可。打印過程如圖所示:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Queue;
/**
* Created by zhangshuyou on 2015/5/22.
*/
/**
* 題目描述:
* 從上往下打印出二叉樹的每個節點,同層節點從左至右打印(即層序遍歷)
* 1.元素 8 出隊,放入list,得到 6 、 10
* 2.元素 6 出隊,放入list,得到 (10) 5 、7
* 3.元素 10 出隊,放入list,得到 (5) (7) (9) (11)
* 4.均無子結點,直接打印
*/
public class Solution {
//建立一個數組雙端隊列,是大小可變數組。線程不安全,但在速度上有一定的優勢。
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
if(root == null)
return list;
queue.add(root); //將結點入隊
while(!queue.isEmpty()){
TreeNode treeNode = queue.poll(); //將元素出隊並保存
list.add(treeNode.val); //將元素的值取到並添加到集合中
if(treeNode.left != null)
queue.add(treeNode.left);
if(treeNode.right != null)
queue.add(treeNode.right);
}
return list;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}