二叉排序树;
二叉排序树的特点
1.如果它的左子树不空,则左子树上的所有节点的值均小于它的根节点的值;
2.如果它的右子树不空,则右子树上的所有节点的值均大于它的根节点的值;
3.它的左,右子树也分别为儿叉排序树
如何处理等号:可以右子树上的所有节点的值均大于或等于它的根节点的值
如果按中序遍历一棵儿叉排序树,则可得到一个按数值大小排序的递增序列。
插入
二叉排序树插入的过程基本是查找,因为是排序的树,所以可以进行快速的对比,最终将节点以叶子的形式增加到树中
删除(主要考虑的是如何在删除后仍然保持排序的状态)
删除的三种情况;
1.是叶子节点-------直接删除
2.有一个孩子-------让孩子直接“继承”双亲的位置
3.有两个孩子--------删除第三种情况的两种方法:
方法一:
这里有第二种常用的方法;
为了保持二叉排序树的结构(中序遍历后由小到大),有两种思路,一种就是从要删除结点的左子树中选取最大的结点进行替代之,另一种就是从要删除的结点的右子树中选取最小的结点替代之。
- 二叉树的删除主要是当双亲节点在树中去除后,孩子节点的处理方式。
比如说在左子树上找中序最后一个节点填补
另一种方法比较不常用:
根据情况让左(或右)子树替代原来双亲的位置,让另一个子树每个元素重新插入。
【之前这个方法是错误的:根据情况让左(或右)子树替代原来双亲的位置,让另一个子树作为其"兄弟树"(应该是没有这个名词)的最值节点的右(或左)子树。之前没有仔细思考,这种方法会破坏二叉排序树的那种平衡的形状】
例子(数据结构,人民邮电出版社):
当被删节点的左右子树都存在时
解决方法一:
用左子树中的最大的元素(或者右子树中的最小元素替换)
错误示例