AVL树实现动态集合寻找第k小数
如果是在静态数组中寻找第k小数的话,可以利用快排思想,在快排代码基础上更改一些,便可完成,时间复杂度为O(n),具体实现不展示。
但是在一个动态集合中,有着频繁的更新和删除操作的话,其实静态数组来实现并不合适,因为插入和删除操作的并不方便,以下是利用AVL树来实现。
具体操作为:在AVL树的基础下,在树中的每个节点中添加一个域——以该节点为根节点的子树的节点数,设为subTreeSize,其它域同AVL树。对于插入操作(函数addNewNode),在插入新节点节点的过程中每遍历到一个节点,更新其子树大小(即插入后子树大小加一);对于删除操作(函数deleteOldNode),如正操的二叉查找树的插入操作,只是在删除递归过程中更新节点的子树大小(即插入后子树大小减一),插入和删除操作时间复杂度均为O(log n)(即树高)。然后找到第k小的操作(findKth),若往左边遍历k的值不发生变化,且节点的值的排序大小为其左子树的节点数+1,而往右遍历时,由于左边子树及当前根节点的值都小于要找的第k小值,此时k-当前节点的排序大小(即在右子树里的相对大小),时间复杂度也为O(log n),具体实现代码如下:
数据结构的定义
1 | typedef struct AVLNode* Position; |
所用到的函数
1 | Position findMin(AVLTree Tree) { //找到树中最小元素 |
调试代码
1 | void qxbl(AVLTree Tree) { //前序遍历 |
运行结果如下
1 | 5 8 |