天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)

Posted jiamian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)相关的知识,希望对你有一定的参考价值。

 

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

输入格式:

输入第一行给出一个不超过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

 

 

这题没想到直接用数组模拟数也能过,220,就算不炸内存也会TLE吧,数据太弱了

 

 1 #include <bits/stdc++.h>
 2 typedef long long LL;
 3 const int INF=0x3f3f3f3f;
 4 const double eps =1e-8;
 5 const int mod=1e9+7;
 6 const int maxn=1e5+10;
 7 using namespace std;
 8 
 9 struct node
10 {
11     int x,id;
12     node *lc, *rc;
13     node(int a,int b)
14     {
15         x=a;
16         id=b;
17         lc=rc=NULL;
18     }
19 };
20 int lastid;
21 
22 void Insert(node *&T,int x,int id)//id是该节点应该在完全二叉树中的序号 
23 {
24     if(T==NULL)
25     {
26         node *p=(node*)malloc(sizeof(node));
27         p->x=x; p->id=id;
28         p->lc=NULL;
29         p->rc=NULL;
30         T=p;
31         //上面所有的可以直接写成:RT=new node(x,id); 
32         lastid=max(lastid,id);
33         return ;
34     }
35     if(T->x < x) Insert(T->lc,x,id<<1);
36     else Insert(T->rc,x,id<<1|1);
37 }
38 
39 int main()
40 {
41     #ifdef DEBUG
42     freopen("sample.txt","r",stdin);
43     #endif
44     
45     int n;
46     scanf("%d",&n);
47     node* RT=NULL;
48     for(int i=1;i<=n;i++)
49     {
50         int x;
51         scanf("%d",&x);
52         Insert(RT,x,1);
53     }
54     
55     queue<node*> qe;
56     int one=1;
57     qe.push(RT);
58     while(!qe.empty())
59     {
60         node* v=qe.front(); qe.pop();
61         if(one)
62         {
63             printf("%d",v->x);
64             one=0;
65         }
66         else printf(" %d",v->x);
67         if(v->lc) qe.push(v->lc);
68         if(v->rc) qe.push(v->rc);
69     }
70     printf("
");
71     
72     if(lastid==n) printf("YES
"); //如果最后一个节点序号是n,必是完全二叉树 
73     else printf("NO
");
74     
75     return 0;
76 }

 

下面再给出用别的方法检查是否是完全二叉树时的注意点:

1:如果当前节点左右孩子均有,就将当前节点弹出,将左右孩子节点加入队列

2:如果当前节点有左孩子,但是没有右孩子,或者左右孩子均没有,则这个节点以后的节点都应该是叶子节点

3:如果当前节点没有左孩子,但是有右孩子,则不是完全二叉树

 

 

 

 

 

-

以上是关于天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)的主要内容,如果未能解决你的问题,请参考以下文章

天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟

PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树)

2021-4-4天梯赛训练赛1补题(是否完全二叉搜索树 (30 分))

PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

华为机试题 二叉查搜索树 判断两序列是否为同一二叉搜索树序列

判断两个二叉树是否相同