7-13 是否完全二叉搜索树 (30 分)

题目链接:https://pintia.cn/problem-sets/1108925599999025152/problems/1108925672111693826

题目大意:

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

输入格式:

输入第一行给出一个不超过20的正整数N;第二行给出N个互不相同的正整数,其间以空格分隔。

输出格式:

将输入的N个正整数顺序插入一个初始为空的二叉搜索树。在第一行中输出结果树的层序遍历结果,数字间以1个空格分隔,行的首尾不得有多余空格。第二行输出YES,如果该树是完全二叉树;否则输出NO

具体思路:建树的话,按照题目条件简历就可以了。具体判断是不是完全二叉树的时候,就是给每个点编号,根节点为1,然后子左节点为2,字右节点为3.按照这个编号形式,然后看最后一个节点的编号和n个关系,如果大于n的话,就不是完全二叉树。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int maxn = 2e5+100;
 6 double a[maxn];
 7 struct node
 8 {
 9     node *lt;
10     node *rt;
11     int data;
12     int id;
13 
14 };
15 int flag=0;
16 int k;
17 int tt;
18 node *Insert(node *root,int data)
19 {
20     if(root==NULL)
21     {
22         tt=1;
23         root=new node;
24         root->data=data;
25         root->lt=NULL;
26         root->rt=NULL;
27         return root;
28     }
29     else if(root)
30     {
31         if(tt==0)
32         {
33             if(data>=root->data)root->lt=Insert(root->lt,data);
34             else root->rt=Insert(root->rt,data);
35         }
36     }
37     return root;
38 }
39 int n;
40 void judge(node*root)
41 {
42     queue<node*>q;
43     q.push(root);
44     root->id=1;
45     while(!q.empty())
46     {
47         node *top=q.front();
48         q.pop();
49         if(top->id>n)flag=1;
50         if(k==0)cout<<top->data,k=1;
51         else cout<<" "<<top->data;
52         if(top->lt){
53                 q.push(top->lt),top->lt->id=top->id*2;
54         }
55         if(top->rt){
56                 q.push(top->rt),top->rt->id=top->id*2+1;
57         }
58     }
59 }
60 int main()
61 {
62     int tmp;
63     k=0;
64     cin>>n;
65     node *head=NULL;
66     for(int i=1; i<=n; i++)
67     {
68         tt=0;
69         cin>>tmp;
70     //    cout<<tmp<<endl;
71         head=Insert(head,tmp);
72     }
73     judge(head);
74     cout<<endl;
75     if(!flag)
76     {
77         printf("YES\n");
78     }
79     else printf("NO\n");
80     return 0;
81 }

 

posted @ 2019-03-23 11:22  Let_Life_Stop  阅读(755)  评论(0编辑  收藏  举报