1.二叉排序树查找
将待查找数据表构造成一颗二叉排序树进行查找。
二叉排序树定义为:若子节点不为空,则子节点树上所有节点均小余该节点;若右节点不为空,则右子树所有节点均大于该节点。
查找过程:
通过中序查找法,即(LDR)方式,可从二叉排序树中得到递增的有序序列。
1.若查找树为空,则查找失败
2.若查找树非空,将给定值KEY与查找数的根节点关键码比较。
3.若相等,则查找成功,返回结果
若KEY小于根节点关键码,则查找将以左节点为根的左子树继续查找,重复1,2,3.
若KEY大于根节点关键码,则查找将以右节点为根的右子树继续查找,重复1,2,3.
(先确定二叉树的存储结构,再考虑如何代码实现)
插入操作:
1.先查找在当前二叉树中,是否存在待插入KEY值
2.若存在,则不再插入
若不存子啊,则插入至刚刚查找到的最后节点处,按最后节点与待插入值的大小关系选择插入左侧还是右侧。
构造二叉排序树:
1.顺序遍历列表,将第一个数作为根节点
2.依次将列表后续树按插入操作构造二叉树。
删除操作:
1.若待删除子节点为叶节点时,直接删除。
2.若待删除子节点仅含左节点或右节点时,则将删除该节点并将相应子节点直接提上来。
3.若待删除子节点包含左右节点时,则
1).将右节点按LDR方式获得的第一个节点数据,提至根节点位置(待删除节点位置)。
2).将待删除节点的左节点挂接在提上来的节点左侧。
3).若提上来的子节点本身存在左右子节点,则将左节点挂入2)步骤左节点的按LDR方式获取的列表最右侧。将子节点右节点挂入提上来节点后的右节点按LDR方式序列的最左侧。
性能分析:
尽量使构造的二叉排序树左右平衡,否则性能和顺序查找一致。若平衡的二叉排序树,则性能与折半查找一致。
2.平衡二叉树(AVL树)
左子树与右子树均为平衡二叉树的二叉排序树,称为平衡二叉树,且左子树和右子树高度之差的绝对值不超过1.
删除,插入,构造方式类似于二叉排序树。但平衡树在经过插入,删除操作后,可能会使树失去平衡,因此需要对失去平衡的树进行调整。
平衡化调整
方式一:左单旋转。
若插入的位置在平衡树中成“\”方向,则执行延逆时针方式旋转,即将根节点右子节点作为根节点。
方式二:右单旋转。
若插入的位置在平衡树中成“/”方向,则执行延顺时针方式旋转,即将根节点左子节点作为根节点。
方式三:先右后左旋转。
若插入的位置在平衡树中成“>”方向,则先执行右单旋转,再执行左单旋转。
方式四:先左后右旋转。
若插入的位置在平衡树中成“<”方向,则先执行左单旋转,再执行右单旋转。