java 從上至下打印二叉樹

從上往下打印二叉樹
題目描述:java

從上往下打印出二叉樹的每一個節點,同層節點從左至右打印。
輸入:
輸入可能包含多個測試樣例。
對於每一個測試案例,輸入的第一行一個整數n(1<=n<=1000, :n表明將要輸入的二叉樹元素的個數(節點從1開始編號)。接下來一行有n個數字,表明第i個二叉樹節點的元素的值。接下來有n行,每行有一個字母Ci。
Ci=’d’表示第i個節點有兩子孩子,緊接着是左孩子編號和右孩子編號。
Ci=’l’表示第i個節點有一個左孩子,緊接着是左孩子的編號。
Ci=’r’表示第i個節點有一個右孩子,緊接着是右孩子的編號。
Ci=’z’表示第i個節點沒有子孩子。
輸出:
對應每一個測試案例,
按照從上之下,從左至右打印出二叉樹節點的值。
樣例輸入:
7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z
樣例輸出:
8 6 10 5 7 9 11
 
二叉樹的實現記得通常都是用指針,左兒子,右兒子,什麼的。
可是本身以爲能夠用數組來實現一發。、
下面就是用數組實現的代碼,主要是存儲二叉樹,和一層一層的打印。
 1 import java.util.Scanner;
 2 
 3 public class Main {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         Scanner in = new Scanner(System.in) ;
 8         int node[][] = new int [1005][4] ; ///0爲節點的值,1左孩子,2父節點,3右孩子
 9         while(in.hasNextInt()){
10             int n = in.nextInt() ;
11             for(int i=1;i<=n;i++){
12                 node[i][0] = in.nextInt() ;
13             }
14             for(int i=1;i<=n;i++){ ///節點的初始化
15                 node[i][2] = i ;
16                 node[i][1]=node[i][3]=0 ;
17             }
18             for(int i=1;i<=n;i++){
19                 String str = in.next() ;
20                 if(str.equals("d")){
21                     int x = in.nextInt() ;
22                     int y = in.nextInt() ;
23                     node[i][1] = x ;
24                     node[i][3] = y ;
25                     node[x][2] = i ;
26                     node[y][2] = i ;
27                 }else if(str.equals("l")){
28                     int x = in.nextInt() ;
29                     node[i][1] = x ;
30                     node[i][3] = 0 ;
31                     node[x][2] = i ;
32                 }else if(str.equals("r")){
33                     int x = in.nextInt() ;
34                     node[i][1] = 0 ;
35                     node[i][3] = x ;
36                     node[x][2] = i ;
37                 }
38             }
39             int root = 1 ;  ///尋找根節點
40             while(root != node[root][2] ){
41                 root = node[root][2] ;
42             }
43             //System.out.println(root);
44             int arry1[] = new int[1005];
45             int arry2[] = new int[1005];
46             arry1[1] = root ;
47             int cnt = 2 ;
48             //System.out.println("yes");
49             
50             ///開始打印二叉樹
51             System.out.print(node[root][0]);
52             while(true){
53                 if(arry1[1]!=root){ ///再也不打印根節點
54                     for(int i=1;i<cnt;i++){
55                         System.out.print(" "+node[arry1[i]][0]);
56                     }
57                 }
58                 int c = 1 ;
59                 for(int i=1;i<cnt;i++){ 
60                     if(node[arry1[i]][1]!=0){  ///若是有左孩子
61                         arry2[c]=node[arry1[i]][1] ;
62                         c++ ;
63                     }
64                     if(node[arry1[i]][3]!=0){  ///若是有右孩子
65                         arry2[c]=node[arry1[i]][3] ;
66                         c++ ;
67                     }
68                 }
69                 cnt=c ;
70                 for(int i=1;i<cnt;i++){
71                     arry1[i] = arry2[i] ; 
72                 }
73                 if(c==1)break ;
74             }
75         }
76     }
77 }
相關文章
相關標籤/搜索