題目:從上往下打印二叉樹的每一個結點,同一層的結點按照從左到右的順序打印。例如輸入下圖的二叉樹,則一次打印出8,6,10,5,7,9,11.java
這道題實質上考察的就是樹的遍歷算法,只是這種遍歷不是咱們熟悉的前序、中序或者後序遍歷。因爲咱們不太熟悉這種按層遍歷的方法,可能已下載也想不清楚遍歷的過程。node
由於按層打印的順序決定應該先打印的根節點,因此咱們從樹的根節點開 始分析。爲了接下來可以打印8的結點的兩個子節點,咱們應該在遍歷到該結點時把值爲6和10的兩個結點保存到一個容器中,如今容器內就有兩個結點了。按照 從左到右打印的要求,咱們先取出值爲6的結點。打印出6後把它的值分別爲5和7的兩個結點放入數據容器。此時數據容器中有三個結點,值分別爲 10,5,7.接下來咱們從數據容器中取出值爲10的結點。注意到值爲10的結點比值爲5,7,的結點先放入容器,此時又比這兩個結點先取出,這就是咱們 一般說的先入先出,所以不難看出這個容器應該是一個隊列。因爲值爲5,7,9,11的結點都沒有子節點,所以只要依次打印便可。算法
經過分析具體例子,咱們能夠找到從上到下打印二叉樹的規律:每一次打印一個結點的時候,若是該結點有子節點,把該結點的子節點放到一個隊列的尾。接下來到隊列的頭部取出最先進入隊列的結點,重複前面打印操做,直到隊列中全部的結點都被打印出爲止。.net
Java代碼實現:隊列
package cglib;get
import java.util.LinkedList;
import java.util.Queue;class
class BinaryTreeNode{
int value;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
}test
public class DeleteNode {
public static void main(String args[])
{ BinaryTreeNode root1=new BinaryTreeNode();
BinaryTreeNode node1=new BinaryTreeNode();
BinaryTreeNode node2=new BinaryTreeNode();
BinaryTreeNode node3=new BinaryTreeNode();
BinaryTreeNode node4=new BinaryTreeNode();
BinaryTreeNode node5=new BinaryTreeNode();
BinaryTreeNode node6=new BinaryTreeNode();
root1.leftNode=node1;
root1.rightNode=node2;
node1.leftNode=node3;
node1.rightNode=node4;
node4.leftNode=node5;
node4.rightNode=node6;
root1.value=8;
node1.value=8;
node2.value=7;
node3.value=9;
node4.value=2;
node5.value=4;
node6.value=7;
DeleteNode test=new DeleteNode();
test.printFromTopToBottom(root1);
}
public void printFromTopToBottom(BinaryTreeNode root){
if(root==null)
return;
Queue<BinaryTreeNode> queue=new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
BinaryTreeNode node=queue.poll();
System.out.print(node.value);
if(node.leftNode!=null){
queue.add(node.leftNode);
}
if(node.rightNode!=null){
queue.add(node.rightNode);
}
}
}
}import
輸出:容器
8879247