算法——二叉搜索树
(注 替换链与标准型为本人为了能够更加清除理解而定义概念)
1.基本原理:
满足二叉搜索树的性质—— 对树中的任意结点x 有以x为根的左子树的任意结点y 与右子树的任意结点z 满足 y.key<=x.key<=z.key 则这个二叉树是二叉搜索树
为了便于判定 常用将叶子结点的两个children指针设置为值NIL (当然 在具体实现算法时可以设置为其他的值)
2.二叉搜索树的构造:
(1)构造机理:
连续地输入一串值 将第一个值作为树的根 后续的输入填充应该满足:首先与根比较 如果>=根则 再与根的右孩子结点比较 如果<=此结点的值 再与其左结点比较 依次顺序进行比较 最后没有要比较的结点值时便将这个值填充到此处
按照这种方法可以最后构造出二叉搜索树
应该注意的是二叉搜索树的性质(也是其是否是二叉搜索树的判定)是由构造法推导所得 可以自行推导
(2)随机构造分析:
在后边的推导中 我们可以发现 对二叉搜索树的一些操作的时间复杂度 依耐于树高
所以对树高的研究至关重要
当我们输入一个排序好的数据时 我们构造的树为成为一个链状 此时的树高度h=n 达到了树高的上限值 此时对树的一系列操作达到了时间复杂度的最坏情况
为了避免这种情况的产生 我们一定要注意构造树的输入序列一定要足够随机
运用概率论的知识可以推导出对输入规模为n的随机输入序列的期望高度为:
E[h]<=lg(n3+6n2+11n+6/24)
故E[h]=O(lgn)
所以一定要保证输入序列的随机性(当然也有一些比较好的方法)
(3)标准型:
定义标准型为 满足二叉搜索树的性质的子树为标准型子树
但是我们有一个更为优雅的方法来判定标准型子树:
一个树的两个子树都是标准型子树 且满足二叉搜索树性质(左子树任意值<=x<=右子树任意值)(可以自行推导)
通过这个性质我们可以发现 一个树是否为标准型的判定 可以采用自下而上的方法 从叶子结点开始递归应用判定方法直到达到根结点
而二叉搜索树的构造是采用了自上而下的方法
3.二叉树的操作:
(1)插入:
作为最简单的操作 只需要按照二叉树的构造法就行 复杂度为O(h)
(2)搜索:
通过比较值的大小 类似于插入操作 复杂度也为O(h)
(3)遍历:
分为中序遍历 前序遍历和后序遍历 算法比较简单 不详细说明 需要注意的是 前序遍历和后序遍历的结果是一个排好序的序列 (这也可以作为一种排序方法 其复杂度为遍历复杂度与构造树复杂度之和) 复杂度为O(n)
(4)删除:
删除结点作为 操作中最复杂的一个算法(代码复杂一点点 相较于前几个操作) 复杂度可证明也为O(h)
具体算法如下图
采用替换链的方法来将左孩子为NIL的结点替换到要删除结点的右孩子的位置 最后 子树替换完成 删除操作
至此二叉搜索树内容基本写完
本人在学习中 日常更新
欢迎大佬指正