[基础数据结构] 判断是否为完全二叉搜索树

简介: 对 二叉搜索树 的定义是:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1 ≤ i ≤ n )的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为 完全二叉树 。给出二叉搜索树的层次 遍历,并判断是否为完全二叉搜索树

二叉搜索树 的定义是:


一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1 ≤ i ≤ n )的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为 完全二叉树


给出二叉搜索树的层次 遍历,并判断是否为完全二叉搜索树

可以参考PTA 链接


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


输入格式:


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


假如我们将二叉搜索树的根节点编号为root = 1,左孩子节点的编号为root<<1,右孩子节点的编号为root<<1|1

那么说我们将得到一颗这样的树形结构(下图为完美二叉树):

4f835575d1d3469fb3247e4c3c5ee3e4.png


所以说在我们的存储过程中,在数组中存储一定是连续的

也就是说:我们将数组初始化为0,有值的部分一定是连续的从1 → n

并不可能出现1 → n 中有的部分为0


Code:


int n,m,k;
int a[1LL<<21];
void build(int id,int x) {
  if(a[id] == 0) a[id] = x;
  else if(x > a[id]) build(id<<1,x);
  else if(x < a[id]) build(id<<1|1,x);
}
int main() {
  n = read;
  for(int i=1; i<=n; i++) {
    int x = read;
    build(1,x);
  }
  int flag = 0;
  for(int i=1; i<=n; i++) {
    if(!a[i]) {
      flag = 1;
      break;
    }
  }
  if(!flag) {
    for(int i=1; i<=n; i++) {
      printf("%d%c",a[i],(i == n ? '\n':' '));
    }
  } else {
    int cnt = 0;
    for(int i=1; i; i++) {
      if(a[i]) {
        cnt ++;
        printf("%d%c",a[i],(cnt == n?'\n':' '));
        if(cnt == n) break;
      }
    }
  }
  printf("%s",flag?"NO":"YES");
  return 0;
}
/**
8
38 24 12 45 58 67 42 51
**/




目录
相关文章
|
4月前
【数据结构】二叉搜索树的功能实现详解
【数据结构】二叉搜索树的功能实现详解
44 0
|
4月前
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(三)
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
|
4月前
|
存储
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(二)
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
|
4月前
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现(一)
【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
|
5月前
|
存储 Java Serverless
【数据结构】哈希表&二叉搜索树详解
本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
111 8
【数据结构】哈希表&二叉搜索树详解
|
7月前
|
存储
【数据结构】AVL树——平衡二叉搜索树
【数据结构】AVL树——平衡二叉搜索树
|
7月前
|
存储 Linux 数据库
【数据结构】二叉搜索树——高阶数据结构的敲门砖
【数据结构】二叉搜索树——高阶数据结构的敲门砖
|
8月前
|
机器学习/深度学习
数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)
数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)
57 1
|
8月前
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
数据结构学习记录——判断是否为同一颗二叉搜索树(题意理解、求解思路、程序搭建框架、具体函数的实现)
83 2
|
8月前
|
算法
数据结构和算法学习记录——小习题-二叉树的遍历&二叉搜索树
数据结构和算法学习记录——小习题-二叉树的遍历&二叉搜索树
52 0

热门文章

最新文章