数据结构简介
树的分类
1. 二叉搜索树
2. AVL树(平衡二叉搜索树)
- 定义
在二叉搜索树的基础上增加平衡条件的树 - 时间复杂度
O(logN) - 平衡方式
必须平衡的节点称为a,a的两颗子树的高度差为2
- 单旋转
对a的左儿子的左子树进行一次插入
对a的右儿子的右子树进行一次插入 - 双旋转
对a的左儿子的右子树进行一次插入
对a的右儿子的左子树进行一次插入
3. 伸展树
- 定义
在二叉搜索树基础上允许树有任意的深度,但是在每次操作之后要使用一个调整规则进行调整,使得后面的操作效率要高,属于自调整类数据结构. - 时间复杂度
任意连续M次操作在最坏的情形下花费时间O(MlogN),所以每次操作的摊还代价是O(logN) - 展开方法
具体情形可以查阅其他资料
- 之字形:执行AVL那样双旋转
- 一字型:类似AVL的单旋转
4. B树/B+树
- 定义
类似二叉搜索树且带有一系列限制使其平衡的M阶树,树的高度比AVL其他树小,多用于数据存储 - 插入和删除操作
具体可以查阅其他资料
- 插入操作会导致节点分裂
- 删除操作会导致节点领养
5. 红黑树
- 定义
红黑树是一种自平衡的二叉查找树,是一种高效的查找树. - 时间复杂度
操作最坏时间复杂度O(logN) - 特点
红黑树是具有下列着色性质的二叉查找树:
- 每一个节点或者着成红色,或者着成黑色.
- 根是黑色的.
- 如果一个节点是红色的,那么它的子节点必须是黑色的.
- 从一个节点到一个nul指针的每一条路径必须包含相同数目的黑色节点.
6. Treap树(树堆)
- 定义
树堆(Treap)是二叉排序树(Binary Sort Tree)与堆(Heap)结合产生的一种拥有堆性质的二叉排序树. - 时间复杂度
期望时间复杂度O(logN) - 特点
1)树堆和二叉堆不一样,二叉堆是完全二叉树,且满足堆序性质,但是树堆不一定是完全二叉树.树堆对结构性没有要求
2)树堆满足堆序要求 - 树堆详细介绍
- 树堆示例代码
7. 名次树(借助树堆实现)
8. 后缀树及后缀数组
- 定义
1)后缀是指从某个位置i开始到整个串末尾结束的一个特殊子串,比如说字符串abcd,bc就是他的其中一个子串,bcd就是他的其中一个后缀.
2)后缀数组就是某个字符串T的所有后缀组成的一个数组
3)后缀树就是包含字符串T所有后缀的压缩trie树(简单的来说) - 后缀数组的作用
1)查找模式P是否存在在文本中:O(PlogT)
2)找出模式P出现的次数:O(P+logT) - 后缀树的作用
1)找出T中最长重复子串:O(T)
2)在两个字符串T1和T2中找出最长公共子串:O(T)
3)找出模式P出现的次数:O§
4)找出指定公共长度L>1的最长子串:O(T) - 详细介绍
- 后缀数组示例代码
- 后缀树库
9. KD-Tree
- 定义
KD-Tree,其实是K-Dimension Tree的缩写,是对数据点在k维空间中划分的一种数据结构.其实,KD-Tree 是一种平衡二叉树. - KD-Tree作用
1)多键值搜索:例如范围搜寻、最邻近搜索 - KD-Tree时间复杂度
1)构建:O(log(^2)n)
2)插入:平均O(logN)
3)删除:平均O(logN)
4)精确查询:平均O(logN)
5)范围查询(理想平衡树最坏): O(k*N^(1-1/k)+m):k为维数,m为每次要搜寻的最近点个数 - KD-Tree Wiki
- KD-Tree CSDN
- 示例代码
- KD-Tree C++库
- KD-Tree C库
树的遍历
1. 树的深度优先遍历
- 算法思想
递归思想 - 算法特点
每个节点会访问三次 - 示例代码
树的深度优先遍历
2. 树的广度优先遍历
- 算法思想
广度优先思想 - 算法特点
- 借助队列方式
- 每个节点被访问一次
- 示例代码
树的广度优先遍历
树的常见习题
1. 二叉搜索树的第K大节点
- 算法思想
- 递归思想
- 递归左节点回溯的时候判断是否是第K大节点
- 二叉搜索树深度优先遍历,如果是中序遍历,则输出的序列是升序序列
- 算法特点
- 每个节点会访问三次
- 递归左节点回溯的时候判断是否是第K大节点
- 右左节点回溯,一旦找到第K大节点,便不能再次递归进入右节点
- 示例代码
二叉搜索树的第K大节点
2. 求二叉树第K层节点数
- 算法思想
- 递归思想
- 算法特点
- 求第K层的节点数,也就是要求第K-1层有无左右子树,存在就统计
- 第K-1层先序判断处理
- 示例代码
求二叉树第K层节点数
3. 求二叉树叶子节点个数
- 算法思想
- 递归思想
- 算法特点
- 节点无左右子树就是叶子节点
- 先序处理(节点会被访问三次,先序 中序 后序处理都可以)
- 示例代码
求二叉树叶子节点个数
4. 求二叉树节点个数
- 算法思想
- 深度优先思想(递归)
- 广度优先思想
- 算法特点
- 深度优先借助递归
- 广度优先借助队列
- 示例代码
求二叉树节点个数
5. 求二叉树深度
- 算法思想
- 深度优先思想(递归)
- 广度优先思想
- 算法特点
- 深度优先借助递归
- 广度优先借助队列
- 示例代码
求二叉树深度