将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。
输入格式:
输入第一行给出一个不超过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
题意
给你n个树,要求你建1个二叉搜索树,输出层序遍历,再输出是否是完全二叉搜索树
题解
1.建二叉搜索树,递归,如果指针==NULL,新建节点即可
2.输出层序遍历,队列,先左后右,如果指针!=NULL,加入队列
3.输出是否完全二叉搜索树,首先,完全二叉树满足,每个节点的编号不大于总个数n
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,a,flag=1; 4 struct Node 5 { 6 int data; 7 Node *Left,*Right; 8 Node():data(0),Left(NULL),Right(NULL){} 9 }; 10 Node *root; 11 int build(int mem,Node *u) 12 { 13 if(u->data==0) 14 { 15 u->data=a; 16 if(mem>n) 17 flag=0; 18 return 0; 19 } 20 else 21 { 22 if(a>u->data) 23 { 24 if(u->Left==NULL) 25 u->Left=new Node(); 26 build(mem*2,u->Left); 27 } 28 else 29 { 30 if(u->Right==NULL) 31 u->Right=new Node(); 32 build(mem*2+1,u->Right); 33 } 34 } 35 } 36 void Level() 37 { 38 int k=0; 39 queue<Node*> qu; 40 qu.push(root); 41 while(!qu.empty()) 42 { 43 Node *u=qu.front();qu.pop(); 44 if(k++)printf(" "); 45 printf("%d",u->data); 46 if(u->Left!=NULL)qu.push(u->Left); 47 if(u->Right!=NULL)qu.push(u->Right); 48 } 49 printf(" %s ",flag?"YES":"NO"); 50 } 51 int main() 52 { 53 scanf("%d",&n); 54 root=new Node(); 55 for(int i=0;i<n;i++) 56 { 57 scanf("%d",&a); 58 build(1,root); 59 } 60 Level(); 61 return 0; 62 }