一、二叉搜索树
一棵二叉树,可以为空;如果不为空,满足以下性质:
1)非空左子树的所有键值小于其根结点的键值
2)非空右子树的所有键值大于其根结点的键值
3)左右子树都是二叉搜索树
二、二叉搜索树操作的特别函数
1、查找
1)Find
① 查找从根结点开始,如果树为空,返回NULL
② 若搜索树非空,则根结点关键字和X进行比较,并进行不同处理
- 若X小于根结点键值,只需要在左子树中继续搜索
- 若X大于根结点键值,只需要在右子树中继续搜索
- 若两者比较结果是相等,搜索完成,返回指向此结点的指针。
上面的方式是一种尾递归,都知道递归的效率不是很高,尾递归是在程序分支的最后(在返回的时候)出现递归,从编译的角度将,尾递归都可以用循环来实现,改为迭代函数:
查找的效率和树的高度有关。如果没有左子树或没有右子树,就形成了一条链,就达不到O(logn)的效果了,所以总的来说我们希望这个树看起来比较平衡,就不往一边倒
2)查找最大元素和最小元素
最大元素一定是在树的最右分支的端结点上
最小元素一定是在树的最左分支的端结点上
所以搜索树的最大元素结点,一定没有右儿子
2、插入和删除
1)二叉搜索树的插入
关键是要找到元素应该插入的位置,可以采用与find类似的方法。
例子
2)二叉搜索树的删除
考虑三种情况:
① 要删除的是叶节点:直接删除,并再修改其父结点指针–置为NULL
② 要删除的结点是只有一个孩子的结点:将其父结点的指针指向要删除结点的孩子结点
③ 要删除的结点有左、右两棵子树:用另一结点代替被删除的结点:右子树的最小元素或者左子树的最大元素