前言-数据结构
数据结构是需要反复咀嚼,不管什么时候都可以重中获取现在在开发中的遇到的问题答案。
树表查找
- 是种动态查找
- 方法1:二叉排序树查找
- 方法2:平衡二叉树查找
- 方法3: B-树 B+树
二叉排序树查找(二叉排序树查找:前提是将查找表组织成为一棵二叉排序树)
- 思想
- 若二叉排序树位空,则查找失败,否则,先拿根结点值与待查值进行比较,若相等,则查找成功,若根结点值大于待查值,则进入左子树重复此步骤,否则,进入右子树重复此步骤,若在查找过程中遇到二叉排序树的叶子结点时,还没有找到待找结点,则查找不成功
- 举例过程
- 查找的性能分析
- 在二又排序树查找中,成功的查找次数不会超过二叉树的深度,而具有n个结点的二叉排序树的深度,最多为log2n, 最坏为n。因此,二叉排序树查找的最好时间复杂度0(log2n),最坏的时间复杂度为0(n),一般情形下,其时间复杂度大致可看成0(log2n), 比顺序查找效率要好,但比二分查找要差。
- 结论
平衡二叉树排序树查找(平衡二叉树树查找)
-
平衡二叉树查找:前提是首先要调整成一棵平衡二叉排序树。
-
思想
-
若平衡二又树为空,则查找失败,否则,先拿根结点值与待查值进行比较,若相等,则查找成功,若根结点值大于待查值,则进入左子树重复此步骤,否则,进入右子树重复此步骤,若在查找过程中遇到平衡二又树的叶子结点时,还没有找到待找结点,则查找不成功。
-
举例过程
-
第一步:调整成一 棵平衡二叉排序树
ps:注意5这个结点,左边2棵树,取最深的3 - 右边2 = 1
-
非平衡二叉树的平衡处理
- 若一棵二叉排序树是平衡二叉树,扦入某个结点后,可能会变成非平衡二叉树,这时,就可以对该二叉树进行平衡处理,使其变成一棵平衡二叉树。
- 处理的原则应该是处理与扦入点最近的、而平衡因子又比1大或比1小的结点。下面将分四种情况讨论平衡处理。
-
情况1: LL型的处理(左左型):注意 ABC 比如 1 8 17,8是中间数
-
情况2: LR型的处理(左右型)
- 如下图,在C的左孩子A上扦入一个右孩子B,使的C的平衡因子由1变成了2,成为不平衡的排序树。这是的平衡处理为:将B变到A与C之间,使之成为LL型,然后按第(1)种情形LL型处理。
- 如下图,在C的左孩子A上扦入一个右孩子B,使的C的平衡因子由1变成了2,成为不平衡的排序树。这是的平衡处理为:将B变到A与C之间,使之成为LL型,然后按第(1)种情形LL型处理。
-
情况3:RR型的处理(右右型)
- 如下图所示,在A的右孩子B上扦入一个右孩子C,使A的平衡因子由-1变成-2,成为不平衡的二叉排序树。这时的平衡处理为:将A逆时针旋转,成为B的左子树,而原来B的左子树则变成A的右子树待扦入结点C成为B的右子树。
- 如下图所示,在A的右孩子B上扦入一个右孩子C,使A的平衡因子由-1变成-2,成为不平衡的二叉排序树。这时的平衡处理为:将A逆时针旋转,成为B的左子树,而原来B的左子树则变成A的右子树待扦入结点C成为B的右子树。
-
情况4:RL型的处理(右左型)
- 如下图所示,在A的右孩子C上扦入一个左孩子B,使A的平衡因子由1变成2,成为不平衡的二叉排序树。这时的平衡处理为:将B变到A与C之间, 使之成为RR型,然后按第(3)种情形RR型处理。
- 如下图所示,在A的右孩子C上扦入一个左孩子B,使A的平衡因子由1变成2,成为不平衡的二叉排序树。这时的平衡处理为:将B变到A与C之间, 使之成为RR型,然后按第(3)种情形RR型处理。
-
第二步:平衡二叉树查找