「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战」。
二叉排序树
定义
二叉排序树:或者是一棵空的二叉树,或者是具有下列性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于根结点的值
- 若它的右子树不空,则右子树上所有结点的值均大于根结点的值
- 它的左右子树也都是二叉排序树
二叉排序树是记录之间满足某种大小关系的二叉树
如何存储二叉排序树?
二叉链表 如下图所示:
二叉排序树的查找
在二叉排序树中查找给定值 k 的过程是
- 若 bt 是空树,则查找失败
- 若k=bt->data,则查找成功
- 若k<bt->data,则在 bt 的左子树上查找
- 若k > bt->data,在 bt 的右子树上查找
二叉排序树的插入
如何在二叉排序树中插入一个元素?例如,插入98
若二叉排序树为空树,则新插入的结点为新的根结点;
否则,新插入的结点必为一个新的叶子结点,其插入位置由查找过程得到。
二叉排序树的构造
例如,给定查找集合{63, 55, 42, 45, 58, 90, 70, 25, 85, 65},构造二叉排序树
- 每次插入的新结点都是二叉排序树上新的叶子结点;
- 找到插入位置后,不必移动其它结点,仅需修改某个结点的指针;
- 在左子树/右子树的查找过程与在整棵树上查找过程相同;
- 新插入的结点没有破坏原有结点之间的关系。
二叉排序树的删除
如何在二叉排序树中删除一个元素?
- 从二叉排序树中删除一个结点之后,要仍然保持二叉排序树的特性
- 当删除分支结点时破坏了二叉排序树中原有结点之间的链接关系,需要重新修改指针,使得删除结点后仍为一棵二叉排序树。 相关问题与解答
情况 1——被删除的结点是叶子结点
操作:将双亲结点中相应指针域的值改为空
情况 2——被删除的结点只有左子树或者只有右子树
操作:将双亲结点中相应指针域指向被删除结点的左子树(或右子树)
情况 3——被删除的结点既有左子树也有右子树
操作:以其左子树中的最大值结点替换之,然后再删除该结点
二叉排序树的性能分析
二叉排序树的深度是多少?取决于什么?
O(n) ~ O(log2n)
取决于查找集合的初始排列