【数据结构笔记27】树习题:完全二叉搜索树(Complete Binary Search Tree)
本次笔记内容:
树习题-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=⌊log2(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)相关推荐
- 高级数据结构与算法 | 二叉搜索树(Binary Search Tree)
文章目录 二叉搜索树的概念 二叉搜索树的作用 排序 查找 实现思路 查找 插入 删除 删除.拷贝等 代码实现 K模型 KV模型 二叉搜索树的概念 二叉搜索树又叫做二叉排序树,他是一个具有以下特性的二叉 ...
- 【ACM】二叉搜索树(Binary Search Tree /BS Tree) 小结
动态管理集合的数据结构--二叉搜索树 搜索树是一种可以进行插入,搜索,删除等操作的数据结构,可以用字典或者优先队列. 二叉排序树又称为二叉查找树,他或者为空树,或者是满足如下性质的二叉树. (1)若它 ...
- java 二叉查找树_如何在Java中实现二叉搜索树( binary search tree)?
二叉搜索树或BST是一种流行的数据结构,用于保持元素的顺序.二叉搜索树是二叉树,其中左子节点的值小于或等于父节点,右子节点的值大于或等于父节点.由于它是二叉树,它只能有0,1或2个子节点.二叉搜索树之 ...
- 二叉搜索树(binary search tree)的建立、删除、查找
由于输入的数据顺序不同,建立的bst会不一样.最坏的情况就是一个链,所以我们引入了平衡二叉树的概念.这里我们先来看binary search tree.(我随笔里面有一些相关知识) 建立(也就是插入) ...
- 数据结构与算法 / 二叉搜索树(Binary Search Tree)
目录 一.定义 二.性质 三.时间复杂度分析 四.遍历方式 五.源码 一.定义 若左子树不空,则左子树上的所有的节点都小于它的根节点. 若右子树不空,则右子树上的所有的节点都大于它的根节点. 左右子树 ...
- leetcode 96. 不同的二叉搜索树(Unique Binary Search Trees)
目录 题目描述: 示例: 解法: 题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结 ...
- 《恋上数据结构第1季》平衡二叉搜索树、AVL树
AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...
- 数据结构---判断一棵树是否是二叉搜索树
数据结构-判断一棵树是否是二叉搜索树 代码: #pragma once #define N 100 #define elemType BTree* #include<stdlib.h> t ...
- 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...
最新文章
- 魔兽怀旧服怎么找不到服务器,魔兽世界怀旧服无法连接服务器怎么解决 服务器连接不上解决方法...
- Python基础04-数据类型:数字、布尔、字符串
- 十六、希尔排序即其优化(交换法--->移动法)
- GPRS的工作原理、主要特点
- c# redis 如何设置过期时间_Redis 过期时间与内存管理
- c语言传入的指针无返回值,c语言 关于指针注意事项
- python从入门到放弃-python从入门到放弃--day1
- Linux安装Jenkins教程
- IBX 常见问题解答(译)
- 数据中心加湿系统计算及方法探讨【新规范加湿方式对比及计算分析】
- android保存url图片到相册简书,Android保存图片到系统相册
- 免费智能机器人聊天API
- 花菁染料Cy3.5 炔烃,Cy3.5 alkyne储存条件及光谱特性解析
- 【Ext.Net学习笔记】03:Ext.Net DirectEvents用法详解、DirectMethods用法详解
- 基因注释-InterProScan
- 应广单片机定时器中断配置
- 卸载antivirus(AVG)教程
- MDM 与 MAM 的区别
- 记录在VeRi-776训练【pytorch】deep_sort中的深度ReID特征
- 四种获取小数点后两位方法
热门文章
- 快速解决MariaDB无密码就可以登录的问题
- mybatis异常:Could not find result map ......... 问题分析及解决
- JavaScript:如何将消息打印到错误控制台?
- CSS显示属性上的过渡
- linux查看绑定ipv6的端口号,[原创]如何在windows和linux绑定IPV6
- win11非uefi启动如何安装 Windows11非uefi启动安装的步骤方法
- win11安装软件没反应怎么办 Windows11安装软件没反应的解决方法
- ue设置MySQL_MySQL的安装与配置——详细教程 - Winton-Q
- java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)
- Android:BaseAdapter简单应用