1.自己设计一个例子,给出不少于十个关键字的序列,按顺序插入一棵空的二叉排序树,画出每一次插入时的样子
1.1知识回顾
二叉排序树右称二叉查找树。或者为空树,或者是具有以下性质:
(1)若它的左子树不为空,则左子树所有节点的值小于根结点,
(2)若它的右子树不为空,则根结点的值小于所有右子树结点的值
(3)它的左右子树叶分别为二叉排序树
总结起来就是根据结点的值有:左子树<根结点<右子树
1.2.构造序列与构造过程
我们以序列[45,24,53,12,37,93]为例
每次插入新的结点都是二叉排序树上的叶子结点,则在插入时,不必移动其他结点,只需改动某个结点的指针,由空变为非空即可。
结点的插入操作与二叉排序树的定义紧密相关,即左<根<右,新插入一个关键字时,从根结点开始比较,直到找到合适的插入位置为止。还有一种情况就是一个序列中可能有两个相同的关键字,对于这种情况,向树中插入关键字时遇到相同关键字时,什么都不做,不进行重复插入操作。
二.基于你设计的例子,计算二叉排序树在查找成功和查找失败时的ASL
假设查找6个关键字的概率相同,查找45成功需要一次,查找24,53,各需要两次,查找12,37,93各需要三次关键字查找成功总共需要(1+2+2+3+3+3)=14次,平均ASL=14/6=7/3次.查找失败时,失败结点有53的左孩子,12,37,93的左右孩子,一共的查找次数为(2+3*6)/7=20/7次
三.依次删除不小于四个元素,依次删除不少于4个元素,画出每一次删除后的样子,需要包含四种删除情况----删一个叶子结点,删一个只有左子树的节点,删一个只有右子树的节点,删一个既有左子树又有右子树的节点
删除二叉排序树中任意一个结点,需要分成以下三种情况讨论:
(1)删除的是叶子结点
这种情况最简单,由于删除叶子结点不会破坏整棵树的结构,只需要修改其双亲结点的指针即可。
(2)删除的结点只有左子树或只有右子树。
这种情况只需要将其左子树或右子树往上推,替代要删除结点的位置,显然,作此修改也不会破坏二叉排序树的结构。
(3)删除的结点左右子树都不为空
这种情况稍微复杂一点,为了不保持二叉排序树的结构,有两种思路,一种就是从要删除结点的左子树中选取最大的结点进行替代之,另一种就是从要删除的结点的右子树中选取最小的结点替代之。
3.1.删除叶子结点
我们选取关键字为12的节点删除,直接删除即可,无需做其他调整
3.2.删除的结点只有左子树
我们发现符合定义的点有24,53,我们选择删除24,将这种情况只需要将其左子树或右子树往上推,替代要删除结点的位置,显然,作此修改也不会破坏二叉排序树的结构,此时树的结构如下
3.3.删除的结点只有右子树
符合定义的结点为53,删除后以右子树的根节点替代被删除的节点,删除后二叉排序树结构如下
3.4.删除的结点有右子树也有左子树
删除的节点为45,有两种思路一种就是从要删除结点的左子树中选取最大的结点(直接前驱)进行替代之,另一种就是从要删除的结点的右子树(直接后继)中选取最小的结点替代之。
1.以后继替代之
2.以前驱替代之
四.自己设计一个例子,给出不少于十个关键字的序列,按顺序插入一棵空的平衡二叉排序树,画出每一次插入时的样子
输入关键字序列(16,3,7,11 ,9,26,18,14,15, 17)给出AVL树
插入关键字序列到16,3,7时,发生左右子树不平衡的情况,需要进行LR旋转
旋转后可旋转为
继续插入11,9,出现如下情况,出现了LL不平衡
变换为平衡二叉树,如下
插入26后,得到二叉树如下,出现了RR不平衡,二叉排序树如下
进行调整后,得到平衡二叉树
插入18后,出现RL不平衡,二叉排序树如下
扭转后二叉排序树如下
插入14,15后,二叉排序树如下,发生了LR不平衡
扭转后,平衡二叉排序树如下
插入17后,发生LR不平衡,二叉树如下
扭转后,平衡二叉树如下
五.基于你设计的例子,计算二叉排序树在查找成功和查找失败时的ASL
成功,一共查找次数为(1*1+2*2+3*4+3*4)=29次,ASL=29/10=2.9次
失败,失败节点为3,9左右孩子,15右孩子,14,17,26的左右孩子,一共查找次数为3*5+4*6=39次,ASL=39/11次