本次笔记内容:
树习题-CBST. 1 数据结构的选择
树习题-CBST. 2 核心算法
树习题-CBST. 3 计算左子树的规模

文章目录

  • 题意理解
  • 分析:用链表还是数组表示树
  • 核心算法
    • 核心递归算法
    • 排序算法
    • 计算左子树的规模

题意理解

如上图右侧,输入一组数,存储到一棵完全二叉树中,并满足二叉搜素树的性质。最后输出完全二叉树层序遍历的结果。

分析:用链表还是数组表示树

本题目中需要的操作:

  • 填写数字(某种遍历);
  • 层序遍历。

分析:

  • 完全二叉树,不浪费空间;
  • 层序遍历 == 直接顺序输出;
  • 因此选择数组。

核心算法

给定了一个n以后,完全二叉树的结构是固定的。

因此,左右子树的结点数便很好确定下来。

如上图右边。先对数字从小到大排序,根据完全二叉树结果,找到根结点位置。找到根结点后,进入了一个递归的解决方案。

核心递归算法

void solve(int ALeft, int ARight, int TRoot)
{// 初始调用为solve(0, N-1, 0)n = ARight - ALeft + 1; // 传入数组段长度if (n == 0)return;L = GetLeftLength(n); // 计算n个结点的树其左子树有多少个结点T[TRoot] = A[ALeft + L];LeftTRoot = TRoot * 2 + 1;RightTRoot = LeftTRoot + 1;solve(ALeft, ALeft + L - 1, LeftTRoot);solve(ALeft + L + 1, ARight, RightTRoot);
}

其思想如上图。T是完全二叉树,第一个结点索引为0。

核心算法前需要实现排序算法,核心算法中需要计算左子树规模,分别在下面介绍。

排序算法

排序算法后面的课程会涉及,这里可以用c的库函数qsort()。

#include<stdlib.h>
int main()
{qsort(A, N, sizeof(int), compare);// A:待排序序列首元素的位置(数组名称)// N:长度// 有时传入结构体,因此要用到sizeof(int)// compare是一个比较两个元素大小的函数
}

本题中,compare如下:

int compare(const void*a, const void*b)
{return *(int*)a - *(int*)b
}

计算左子树的规模

如上图,先计算完美二叉树被填满的层数,H可以简化为H=⌊log⁡2(N+1)⌋H=\lfloor \log_2(N+1) \rfloorH=⌊log2​(N+1)⌋

左子树的个数为H-1层的完美二叉树加X,即

L=2H−1−1+XL=2^{H-1}-1+XL=2H−1−1+X

但是应注意,X有可能是包含了右子树结点的,因此要设置X最大值和最小值,为

Xmin=0X_{min} = 0Xmin​=0

Xmax=2H−1X_{max}=2^{H-1}Xmax​=2H−1

因此,X的取值为

X=min⁡{X,2H−1}X=\min{\{ X,2^{H-1} \}}X=min{X,2H−1}

【数据结构笔记27】树习题:完全二叉搜索树(Complete Binary Search Tree)相关推荐

  1. 高级数据结构与算法 | 二叉搜索树(Binary Search Tree)

    文章目录 二叉搜索树的概念 二叉搜索树的作用 排序 查找 实现思路 查找 插入 删除 删除.拷贝等 代码实现 K模型 KV模型 二叉搜索树的概念 二叉搜索树又叫做二叉排序树,他是一个具有以下特性的二叉 ...

  2. 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结

    动态管理集合的数据结构--二叉搜索树 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列. 二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树. (1)若它 ...

  3. java 二叉查找树_如何在Java中实现二叉搜索树( binary search tree)?

    二叉搜索树或BST是一种流行的数据结构,用于保持元素的顺序.二叉搜索树是二叉树,其中左子节点的值小于或等于父节点,右子节点的值大于或等于父节点.由于它是二叉树,它只能有0,1或2个子节点.二叉搜索树之 ...

  4. 二叉搜索树(binary search tree)的建立、删除、查找

    由于输入的数据顺序不同,建立的bst会不一样.最坏的情况就是一个链,所以我们引入了平衡二叉树的概念.这里我们先来看binary search tree.(我随笔里面有一些相关知识) 建立(也就是插入) ...

  5. 数据结构与算法 / 二叉搜索树(Binary Search Tree)

    目录 一.定义 二.性质 三.时间复杂度分析 四.遍历方式 五.源码 一.定义 若左子树不空,则左子树上的所有的节点都小于它的根节点. 若右子树不空,则右子树上的所有的节点都大于它的根节点. 左右子树 ...

  6. leetcode 96. 不同的二叉搜索树(Unique Binary Search Trees)

    目录 题目描述: 示例: 解法: 题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结 ...

  7. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

  8. 数据结构---判断一棵树是否是二叉搜索树

    数据结构-判断一棵树是否是二叉搜索树 代码: #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> t ...

  9. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例

    一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...

  10. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

最新文章

  1. 魔兽怀旧服怎么找不到服务器,魔兽世界怀旧服无法连接服务器怎么解决 服务器连接不上解决方法...
  2. Python基础04-数据类型:数字、布尔、字符串
  3. 十六、希尔排序即其优化(交换法--->移动法)
  4. GPRS的工作原理、主要特点
  5. c# redis 如何设置过期时间_Redis 过期时间与内存管理
  6. c语言传入的指针无返回值,c语言 关于指针注意事项
  7. python从入门到放弃-python从入门到放弃--day1
  8. Linux安装Jenkins教程
  9. IBX 常见问题解答(译)
  10. 数据中心加湿系统计算及方法探讨【新规范加湿方式对比及计算分析】
  11. android保存url图片到相册简书,Android保存图片到系统相册
  12. 免费智能机器人聊天API
  13. 花菁染料Cy3.5 炔烃,Cy3.5 alkyne储存条件及光谱特性解析
  14. 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解
  15. 基因注释-InterProScan
  16. 应广单片机定时器中断配置
  17. 卸载antivirus(AVG)教程
  18. MDM 与 MAM 的区别
  19. 记录在VeRi-776训练【pytorch】deep_sort中的深度ReID特征
  20. 四种获取小数点后两位方法

热门文章

  1. 快速解决MariaDB无密码就可以登录的问题
  2. mybatis异常:Could not find result map ......... 问题分析及解决
  3. JavaScript:如何将消息打印到错误控制台?
  4. CSS显示属性上的过渡
  5. linux查看绑定ipv6的端口号,[原创]如何在windows和linux绑定IPV6
  6. win11非uefi启动如何安装 Windows11非uefi启动安装的步骤方法
  7. win11安装软件没反应怎么办 Windows11安装软件没反应的解决方法
  8. ue设置MySQL_MySQL的安装与配置——详细教程 - Winton-Q
  9. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)
  10. Android:BaseAdapter简单应用