1. 程式人生 > >[劍指offer學習心得]之:從上往下列印二叉樹

[劍指offer學習心得]之:從上往下列印二叉樹

題目:從上往下打印出二叉樹的每個結點,同一層的結點按照從左向右的順序列印。

解題思路

其實一想就覺得是寬度優先遍歷。當然這樣想是不是太粗暴了,循序漸進循序漸進

這道題實質就是考察樹的遍歷演算法,只是這種演算法不是我們熟知的那三種,所以呢我們可能一下子也想不清楚遍歷的過程,所以可以先好好分析一下下面這棵樹:

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); } }