[劍指offer學習心得]之:從上往下列印二叉樹
阿新 • • 發佈:2019-02-18
題目:從上往下打印出二叉樹的每個結點,同一層的結點按照從左向右的順序列印。
解題思路
其實一想就覺得是寬度優先遍歷。當然這樣想是不是太粗暴了,循序漸進循序漸進
這道題實質就是考察樹的遍歷演算法,只是這種演算法不是我們熟知的那三種,所以呢我們可能一下子也想不清楚遍歷的過程,所以可以先好好分析一下下面這棵樹:
8
| \
6 10
| \ | \
5 7 9 11
按照層次列印順序決定應該先列印根結點,所以可以從樹的根結點開始分析啦。為了接下來能夠列印值為8的左右兩個子結點,我們應該在遍歷到該結點時把值為6和10的兩個結點儲存到一個容器裡,現在容器內就有兩個結點了。按照從左到右的列印要求,所以先取出值為6的結點。打印出值6之後把它的值分別為5和7的兩個結點放入資料容器中。此時容器中有三個結點:10、5、7。接下來我們從資料容器中取出值為10的結點。10是比5、7結點先放入的,因此不難看出這個資料容器應該是一個佇列。由於值為5、7、9、11的結點都沒有子結點,因此只要依次列印即可。
所以我們可以找出這樣一條規律:每一次列印一個結點的時候,如果該結點有子結點,則把該結點的子結點放到一個佇列的末尾。接下來到佇列的頭部取出最早進入佇列的結點,重複前面的列印操作,直到佇列中所有的結點都被打印出來為止。
import java.util.LinkedList;
import java.util.Queue;
public class PrintFromTopToBottom {
/**
* 二叉樹節點類
*/
public static class BinaryTreeNode {
int value;
BinaryTreeNode left;
BinaryTreeNode right;
}
public static void printFromTopToBottom(BinaryTreeNode root){
if(root==null){
return;
}
Queue<BinaryTreeNode> list=new LinkedList<BinaryTreeNode>();
list.add(root);
BinaryTreeNode curNode;
while(!list.isEmpty ()){
curNode=list.remove();
System.out.print(curNode.value+" ");
if(curNode.left!=null){
list.add(curNode.left);
}
if(curNode.right!=null){
list.add(curNode.right);
}
}
}
public static void main(String[] args){
// 8
// / \
// 6 10
// / \ / \
// 5 7 9 11
BinaryTreeNode root = new BinaryTreeNode();
root.value = 8;
root.left = new BinaryTreeNode();
root.left.value = 6;
root.left.left = new BinaryTreeNode();
root.left.left.value = 5;
root.left.right = new BinaryTreeNode();
root.left.right.value = 7;
root.right = new BinaryTreeNode();
root.right.value = 10;
root.right.left = new BinaryTreeNode();
root.right.left.value = 9;
root.right.right = new BinaryTreeNode();
root.right.right.value = 11;
printFromTopToBottom(root);
// 1
// /
// 3
// /
// 5
// /
// 7
// /
// 9
BinaryTreeNode root2 = new BinaryTreeNode();
root2.value = 1;
root2.left = new BinaryTreeNode();
root2.left.value = 3;
root2.left.left = new BinaryTreeNode();
root2.left.left.value = 5;
root2.left.left.left = new BinaryTreeNode();
root2.left.left.left.value = 7;
root2.left.left.left.left = new BinaryTreeNode();
root2.left.left.left.left.value = 9;
System.out.println("\n");
printFromTopToBottom(root2);
// 0
// \
// 2
// \
// 4
// \
// 6
// \
// 8
BinaryTreeNode root3 = new BinaryTreeNode();
root3.value = 0;
root3.right = new BinaryTreeNode();
root3.right.value = 2;
root3.right.right = new BinaryTreeNode();
root3.right.right.value = 4;
root3.right.right.right = new BinaryTreeNode();
root3.right.right.right.value = 6;
root3.right.right.right.right = new BinaryTreeNode();
root3.right.right.right.right.value = 8;
System.out.println("\n");
printFromTopToBottom(root3);
// 1
BinaryTreeNode root4 = new BinaryTreeNode();
root4.value = 1;
System.out.println("\n");
printFromTopToBottom(root4);
// null
System.out.println("\n");
printFromTopToBottom(null);
}
}