题目:
将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。
输出格式:
将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出“YES”,如果该树是完全二叉树;否则输出“NO”。
输入样例1:9 38 45 42 24 58 30 67 12 51输出样例1:
38 45 24 58 42 30 12 67 51 YES输入样例2:
8 38 24 12 45 58 67 42 51输出样例2:
38 45 24 58 42 12 67 51 NO
代码:
import java.util.Scanner;
public class Main {
//用数组表示二叉树,k的子节点为2*k和2*k+1,如果节点值为0则在此插入i,否则在该节点的子树中插入i
static int [] arr=new int [10000];
static void insert(int i,int node){
if(arr[node]==0){
arr[node]=i;
return;
}
else if(arr[node]>i){
insert(i, node*2+1);
}
else insert(i, node*2);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
for(int i=0;i<n;i++){
int tmp=scanner.nextInt();
insert(tmp, 1);//把输入插入用数组表示的二叉树arr中
}
int cnt=0;
boolean flag=true;//用flag标记是否是平衡二叉树
//如果是二叉树,则插入的值会分布在arr[1],arr[2],arr[3],arr[4]...中
for(int i=1;;i++){
if(cnt==n)
break;
if(arr[i]!=0)
{
if(cnt!=0)
System.out.print(" ");
System.out.print(arr[i]);
cnt++;//每遍历到一个非0节点,则输出计数器加1
}
else{
flag=false;//如果遍历到0节点,则说明该节点没有插入值,则非平衡二叉树
}
}
System.out.println();
if(flag)
System.out.print("YES");
else System.out.print("NO");
}
}