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

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

输入格式:

输入第一行给出一个不超过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("\n");
71
72     if(lastid==n) printf("YES\n"); //如果最后一个节点序号是n,必是完全二叉树
73     else printf("NO\n");
74
75     return 0;
76 }

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

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

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

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

-

原文地址:https://www.cnblogs.com/jiamian/p/12578571.html

时间: 2024-10-09 05:06:14

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

小白专场-是否同一颗二叉搜索树-python语言实现

目录 一.二叉搜索树的相同判断 二.问题引入 三.举例分析 四.方法探讨 4.1 中序遍历 4.2 层序遍历 4.3 先序遍历 4.4 后序遍历 五.总结 六.代码实现 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html 一.二叉搜索树的相同判断 二叉搜索树是一种特殊的二叉树,在一定程度上是基于二分查找思想产生的,在它的任何一个节点node处,node的左子

PTA 7-28 搜索树判断(镜像二叉搜索树的后序遍历)

算法源代码在 Veeupup Github 考点: 二叉搜索树遍历方式和性质运用 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树. 现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列. 输入格式: 输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所

【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j

[LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. Calling next() will return the next smallest number in the BST. Note: next() and hasNext() should run in average O(1) time and uses

二叉搜索树的遍历

------------------siwuxie095 二叉搜索树的遍历 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

二叉搜索树的插入

--------------------siwuxie095 二叉树的插入 程序: BST.h: #ifndef BST_H #define BST_H #include "stdlib.h" #include <queue> //二叉搜索树 template <typename Key, typename Value> class BST { private: struct Node { Key key; Value value; Node *left; No

二叉搜索树的查找

---------------------siwuxie095 二叉搜索树的查找 程序:二叉搜索树和顺序查找表的查找对比 FileOps.h: #ifndef FILEOPS_H #define FILEOPS_H #include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; namespace FileOps { int fir

二叉搜索树的顺序性

------------------siwuxie095 二叉搜索树的顺序性 二叉搜索树具有一定的顺序性,即 使用二叉搜索树可以回答很多 元素之间的和顺序相关的问题,如下: (1)minimum 和 maximum 通过二叉搜索树可以非常容易地找到一组数据中最小的元素 minimum 和最大的元素 maximum (2)predecessor 和 successor 通过二叉搜索树可以非常容易地找到一个元素的前驱 predecessor 和后继 successor (3)floor 和 ceil