zoukankan      html  css  js  c++  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 }
  • 相关阅读:
    关于RGB屏调试的一些知识(转)
    分享调试SI4432的一些小经验(转)
    音频压缩SPEEX应用,对讲机
    Codec 2 开源语音编解码器
    java导读
    视频监控知识汇总
    “inno setup打包,win7下安装没有桌面快捷方式,xp下安装正常”
    MFC设置窗体大小SetWindowPos
    C++中运行外部程序
    C++调用外部应用程序的方法的整理总结(常用)
  • 原文地址:https://www.cnblogs.com/TOM96/p/5243484.html
Copyright © 2011-2022 走看看