查找树是一种动态数据结构,支持插入、删除、查找等操作。
二叉查找树的复杂度和树的高度是成正比的。有n个节点的完全二叉树,树高为O(lgn)。但是如果树含义n个节点,如果为斜的,则成为链表,高度为O(n)。
1. 二叉查找树
每个节点最多有两个分支。对于每个节点。左孩子的任何节点小于根,根小于右孩子的任何节点。
2. 二叉排序
与快排的比较。
二叉排序,使用将数组创建二叉树,再以中序输出树即得排序。
随机化算法,不是按下标顺序插入树中,而是按照随机的顺序将值插入到树中,所有n!种顺序等可能。(不是随机选择元素插入树中!)直到完全插入。与随机化快排随机选择主元类似。
3. 复杂度及实现思路
查找时间:与当前节点相等则找到;否则如果小于当前节点,则在左子树找,如果左子树空,查找失败;否则大于当前节点,则在右子树找,如果右子树空,查找失败。O(h),h为树高。
最小元素:最左边。O(h)
最大元素:最右边。O(h)。
后继:如果有右孩子,则为右孩子的最左边的孩子。否则,右孩子为空,且如果存在后继,则后继为最低(树层次上最下层满足条件)祖先节点,且该祖先节点的左孩子也为祖先。O(h),因为向上找,最多到根。
前驱:如果有左孩子,则为左孩子的最右边的孩子。否则如果左孩子为空,且如果存在前驱,则前驱为最低(树层次上最下一层满足条件)祖先节点,且该祖先节点的右孩子也为祖先。O(h),向上找,最多到根。
插入:插入的节点都是新节点,只要找到其父节点,并判断是左孩子还是右孩子即可。
删除:
如果要删除的节点无孩子,则将父节点中指向该节点的值改为NIL;
如果要删除的节点只有一个孩子,则将父节点中指向该节点的值改为指向该节点的孩子;如果有两个孩子,则先删除后继(后继最多有右孩子,如果有右孩子,则删除后继节点为第二种情况),再将后继节点替换到要删除的节点处。
(二叉查找树中,如果一个节点有两个孩子,则该节点后继无左孩子,该节点前驱无右孩子。)
4. 随机二叉查找树的复杂度分析。
期望、幂函数、凸函数、jensen不等式。
随机构造的二叉查找树,期望高度为O(lgn)。
5. 应用
二叉查找与最小堆区别和联系。
中序遍历非递归算法,使用栈的方法,不用栈的方法。
前序遍历、后序遍历。
6. 基数树