二叉查找树是所有结点的左孩子都不大于该结点,右孩子都不小于该结点的二叉树,这里介绍一下相关的操作和时间复杂度
按顺序遍历
基于上面介绍的二叉查找树的特点,很容易看出来只要对树进行中序遍历,即先左子树,再根结点,最后右子树的顺序输出,就能得到由小到大排序的结点列表。
遍历所需时间为O(n)查询二叉查找树
还是基于二叉查找树的特性,要查询key值的元素,首先比较它和根结点的大小,如果正好等于根结点的值,那么直接就找到了,如果比根结点的值小的话,就递归左子树查找,否则递归右子树,实在找不到就返回一个找不到的下标就好了。
根据以上思路,可以得出,不管有没有找到,最坏的情况就是由上而下地走完树的高度,所以该操作所用时间为O(树的高度)查找最大/最小元素
最大元素即右子树最右边的结点,最小的元素即左子树最左边的结点
同上,算法的运行时间最多就是走完树的高度,所以运行时间也是O(树的高度)查找前驱和后继元素
这个个人看法和《《算法导论》》中的有些不同,待确认后再补上插入元素
首先和根元素比较,如果比根元素小的话,则考虑插在跟元素的左子树下,如果比根元素大的话,则考虑插在跟元素的右子树下,如果相等的话就无所谓了,哪边都行,这样递归下去直至想要插入的位置为空,那么就插在那里就ok了
运行时间O(树的高度)- 删除元素
这里要分三种情况:
*要删除的结点没有孩子:如果该结点有父节点的话就删除要删除的结点,然后在该父节点那将该结点原本的位置指针置为空就好
*要删除的结点只有一个孩子:要让该结点的孩子顶替它之前的位置
*要删除的结点有两个孩子:删除该结点的后继结点y(该结点一定至多有一个子女,所以这一步可使用上面那种情况的方法),然后,用y的关键字值替换掉z的关键字
运行时间O(树的高度)