PAT L3-010 是否完全二叉搜索树(二叉搜索树)

将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果。

输入格式:

输入第一行给出一个不超过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("\n%s\n",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 }

posted on 2018-02-28 20:58  大桃桃  阅读(195)  评论(0编辑  收藏  举报

导航