数据结构简介:树

数据结构简介

数据结构简介

树的分类

1. 二叉搜索树
  • 定义
    左子树值比父亲值小,右子树值比父亲值大
  • 时间复杂度
    在没有删除或者惰性删除的情况下,所有操作的时间复杂度平均为O(logN)
  • 示例代码
  • 具体介绍
2. AVL树(平衡二叉搜索树)
  • 定义
    在二叉搜索树的基础上增加平衡条件的树
  • 时间复杂度
    O(logN)
  • 平衡方式
    必须平衡的节点称为a,a的两颗子树的高度差为2
  1. 单旋转
    对a的左儿子的左子树进行一次插入
    对a的右儿子的右子树进行一次插入
  2. 双旋转
    对a的左儿子的右子树进行一次插入
    对a的右儿子的左子树进行一次插入
3. 伸展树
  • 定义
    在二叉搜索树基础上允许树有任意的深度,但是在每次操作之后要使用一个调整规则进行调整,使得后面的操作效率要高,属于自调整类数据结构.
  • 时间复杂度
    任意连续M次操作在最坏的情形下花费时间O(MlogN),所以每次操作的摊还代价是O(logN)
  • 展开方法
    具体情形可以查阅其他资料
  1. 之字形:执行AVL那样双旋转
  2. 一字型:类似AVL的单旋转
4. B树/B+树
  • 定义
    类似二叉搜索树且带有一系列限制使其平衡的M阶树,树的高度比AVL其他树小,多用于数据存储
  • 插入和删除操作
    具体可以查阅其他资料
  1. 插入操作会导致节点分裂
  2. 删除操作会导致节点领养
5. 红黑树
  • 定义
    红黑树是一种自平衡的二叉查找树,是一种高效的查找树.
  • 时间复杂度
    操作最坏时间复杂度O(logN)
  • 特点
    红黑树是具有下列着色性质的二叉查找树:
  1. 每一个节点或者着成红色,或者着成黑色.
  2. 根是黑色的.
  3. 如果一个节点是红色的,那么它的子节点必须是黑色的.
  4. 从一个节点到一个nul指针的每一条路径必须包含相同数目的黑色节点.
6. Treap树(树堆)
  • 定义
    树堆(Treap)是二叉排序树(Binary Sort Tree)与堆(Heap)结合产生的一种拥有堆性质的二叉排序树.
  • 时间复杂度
    期望时间复杂度O(logN)
  • 特点
    1)树堆和二叉堆不一样,二叉堆是完全二叉树,且满足堆序性质,但是树堆不一定是完全二叉树.树堆对结构性没有要求
    2)树堆满足堆序要求
  • 树堆详细介绍
  • 树堆示例代码
7. 名次树(借助树堆实现)
  • 定义
    在树堆的基础上实现,增加两个功能
    Kth(k):查找第k小的元素
    Rank(x):x的名次,即x是第几小的元素
  • 时间复杂度
    O(logN)
  • 示例代码
  • 名次树介绍
  • libstdc++
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. 借助队列方式
  2. 每个节点被访问一次

树的常见习题

1. 二叉搜索树的第K大节点
  • 算法思想
  1. 递归思想
  2. 递归左节点回溯的时候判断是否是第K大节点
  3. 二叉搜索树深度优先遍历,如果是中序遍历,则输出的序列是升序序列
  • 算法特点
  1. 每个节点会访问三次
  2. 递归左节点回溯的时候判断是否是第K大节点
  3. 右左节点回溯,一旦找到第K大节点,便不能再次递归进入右节点
2. 求二叉树第K层节点数
  • 算法思想
  1. 递归思想
  • 算法特点
  1. 求第K层的节点数,也就是要求第K-1层有无左右子树,存在就统计
  2. 第K-1层先序判断处理
3. 求二叉树叶子节点个数
  • 算法思想
  1. 递归思想
  • 算法特点
  1. 节点无左右子树就是叶子节点
  2. 先序处理(节点会被访问三次,先序 中序 后序处理都可以)
4. 求二叉树节点个数
  • 算法思想
  1. 深度优先思想(递归)
  2. 广度优先思想
  • 算法特点
  1. 深度优先借助递归
  2. 广度优先借助队列
5. 求二叉树深度
  • 算法思想
  1. 深度优先思想(递归)
  2. 广度优先思想
  • 算法特点
  1. 深度优先借助递归
  2. 广度优先借助队列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值