題目:從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
解析:
1.所有節點全部放入一個List中
①創建隊列Queue,開始將根節點add進隊裏中;
②取出隊列中的結點,將該節點加入List中;
③再將該節點的左、右結點add進Queue隊列中;
④循環②③步驟,直到Queue隊列爲空,所有節點全部被添加進List中;
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root){
ArrayList<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);//根節點入隊列
while ( !queue.isEmpty()){
TreeNode node = queue.poll();//取出隊列的頭部結點元素
if (node.left != null){
queue.add(node.left);//向隊列尾部加入取出結點的左節點
}
if (node.right != null){
queue.add(node.right);//向隊列尾部加入取出結點的右節點
}
list.add(node.val);
}
return list;
}
2.將每一層結點放入一個List當中
①創建隊列Queue,將根節點放入Queue中;
②獲取當前Queue隊列的元素個數size;
③將隊列Queue中的size個元素出隊列,將這size個元素具有的左右結點壓入隊列Queue中同時將這size個元素加入新建的List中。
④循環步驟②③,直到隊列爲空;
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if (root == null) return list;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while ( ! queue.isEmpty()){
List<Integer> list0 = new ArrayList<Integer>();
int size = queue.size();//每一層的結點個數
//將當前層的結點彈出,並加入list0中,同時下一層的結點壓入隊列中,
while (size > 0){
TreeNode node = queue.poll();//隊列頭彈出
if (node.left != null){
queue.add(node.left);
}
if (node.right != null){
queue.add(node.right);
}
list0.add(node.val);
size--;
}
list.add(list0);
}
return list;
}