[总结] 二叉排序树

 

1 概述
二叉排序树(Binary Sorting Tree)或者是一棵空树,或者具有如下性质:
(1)若它有左子树,则左子树上所有的结点的数据均小于根结点的数据;
(2)若它有右子树,则右子树上所有的结点的数据均大于根结点的数据;
(3)左、右子树本身又是一棵二叉排序树。
如下图所示:
易知:非空二叉排序树中结点数据是按照左子树、树、右子树这种顺序排列的。所以对其中序遍历得到的结点序列是一个有序序列。对于上图所示的二叉排序树,对其中序遍历的结果为:
12,24,28,37,40,45,53,55,60,70
可以看出,该序列是按升序排列的。
通常可以取二叉链表作为二叉排序树的存储结构,并在此基础上进行查找、插入、删除等操作。存储结构如下:
2 二叉排序树的查找
二叉排序树又称二叉查找树。当二叉排序树不为空时,首先将key值与根结点的关键字比较,若相等,则查找成功,否则将依据给定值和根结点的关键字之间的大小关系,分别在其左子树或右子树上进行查找。
2.1 二叉排序树查找的递归实现
在根指针t所指向二叉排序树中递归地查找某个关键字等于key的元素,若查找成功,则返回指向该数据元素的指针,否则返回空指针。
2.2 二叉排序树查找的非递归实现
同理,可根据二叉排序树的特征,进行非递归查找,若查找成功,则返回指向该数据元素的指针,否则返回空指针:
3 二叉排序树的插入
二叉排序树是一种动态表。其特点是,树的结构通常不是一次生成的,而是在查找过程中,发现有树中有不存在的关键字时再进行插入。新插入的结点一定是一个新添加的叶子结点,并且是查找不成功时,查找路径上访问的最后一个结点的左孩子或者右孩子。
在进行二叉排序树的插入之前,需要寻找插入的位置。与上述单纯的查找某个元素不同的是,此时还需要知道插入结点的父结点。仍然假设t为树根指针,再向该二叉树中增加新的结点,其关键字为key,具体过程如下:
(1)申请保存结点pnew的内存,将关键字保存在结点的数据域;
(2)在二叉排序树中查找插入结点pnew的父结点;
(3)比较结点p的数据和父结点的数据,决定将pnew插入到父结点的左子树还是右子树。
这里同样用递归和非递归两种方法来实现。
3.1 对递归查找算法的小修改
因为需要知道插入结点的父结点,所以对2.1中的查找算法做一点小小的修改,以便能在查找不成功时返回插入位置。
在根指针t所指二叉排序树中递归查找其关键字等于key的数据元素,若查找成功,则指针p所指向该数据元素结点,并返回true;否则p指向查找路径上访问的最后一个结点并返回false;指针parent指向t的双亲,其初始化调用为NULL。 得到插入位置的父结点后,则可进行插入操作了。
3.2 二叉排序树插入的非递归算法
也可用下面的方法向二叉排序树中插入数据元素。这里将查找插入点和插入数据两部分写在了一起。 从上面的插入过程中可以看到,每次插入的新结点都是二叉排序树上新的叶子结点,则在进行插入操作时,不必移动其它结点,仅需改动某个结点的指针,由空变为非空即可。这就相当于在一个有序序列上插入一个记录而不需要移动其它记录。
这表明,二叉排序树既拥有类似折半查找的特性,又采用了链式做存储结构,具有链式存储结构的一些优点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值