树查找专题-二叉查找树、平衡二叉树、B+树、B-树、红黑树

查找

查找表分为静态查找表和动态查找表,静态查找表是查找操作不会修改表,而查找可能会对表进行修改操作,其表结构是在查找过程中动态生成的。

静态表查找

静态查找主要有顺序查找、二分查找、分块查找(索引顺序查找)。

动态表查找

本文主要介绍动态表查找中树形结构的原理及实现。

二叉排序树(Binary Sort Tree)

二分查找具有较高的查找效率,平均查找时间复杂度为O(lgn),但是二分查找要求查找表有序,而排序需要额外的时间开销,抵消了二分查找的优点。`二叉查找树(BST)`又称`二叉排序树` 亦称 `二叉搜索树`,不仅具有二分查找的效率,同时便于在查找表中进行记录的增加和删除。

1. 二叉排序树定义

二叉排序树或者是一棵空树,或者是一颗具有以下性质的二叉树:

(1) 若左子树不空,则左子树上所有结点的值均小于根结点的值。

(2) 若右子树不空,则右子树上所有结点的值均大于根结点的值。

(3) 它的左右子树都是二叉排序树。

2. java实现

2.1 节点类:


public class BiTreeNode {

    public int data;

    public BiTreeNode lchild, rchild;



    public BiTreeNode(int data) {

        this.data = data;

    }



    public BiTreeNode(int data, BiTreeNode lchild, BiTreeNode rchild) {

        super();

        this.data = data;

        this.lchild = lchild;

        this.rchild = rchild;

    }

}

2.2 搜索算法实现:


public class BSTree {

    public BiTreeNode root;



    public boolean searchBST(int key) {

        return searchBST(root, key);

    }



    // 输入查找关键字,找到返回true

    public boolean searchBST(BiTreeNode node, int key) {

        if (root.data == key) {

            return true;

        } else if (key <= root.data) {

            searchBST(node.lchild, key);

        } else {

            searchBST(node.rchild, key);

        }

        return false;

    }

}

2.3 查找树的插入算法实现


    public boolean insertBST(int e) {

        return insertBST(root, e);

    }

    public boolean insertBST(BiTreeNode node, int value) {

        if (value == node.data) // 不能插入重复的数据

            return false;

        if (value < node.data) {

            if (node.lchild == null) {

                node.lchild = new BiTreeNode(value);

                return true;

            } else {

                return insertBST(node.lchild, value);

            }

        } else {

            if (node.rchild == null) {

                node.rchild = new BiTreeNode(value);

                return true;

            } else {

                return insertBST(node.rchild, value);

            }

        }

    }

假设插入序列为{49,25,55,10,51,65},其构造一棵二叉排序树结果是:

《树查找专题-二叉查找树、平衡二叉树、B+树、B-树、红黑树》

2.4 二叉排序树删除操作

删除操作可以分成4种情况

(1)  若待删除的结点是叶子结点,则直接删除即可。

(2)  若待删除结点只有左子树,无右子树,可以直接将其左子树的根结点替代被删除结点的位置。

(3)  若待删除结点只有右子树,无左子树,可以直接将其右子树的根结点替代被删除结点的位置。

(4) 待删除结点既有左子树又有右子树,可以用被删除结点在中序遍历序列下的前趋结点代替被删除结点,同时删除其中序遍历序列下的前趋结点。

平衡二叉树(AVL)树

二叉排序树的查找效率与二叉树的开关有关。对于给定序列建立二叉排序树,若其左右子树均匀分布,时间复杂度为O(logn).但若给定序列原来有序,则建立的二叉排序树就蜕化为单链表,其查找效率同顺序查找一样,时间复杂度为O(n).因此,在构造二叉排序过程中,当出现左右子树分布不均匀时,若能对其调整,保持左右均匀,可以保持较高的查找效率。这就需要引入平衡二叉树的概念。

`平衡二叉树`(Balanced Binary Tree)又称AVL树,它或是空树,或是一棵具有限定性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树深度之差的绝对值不超过1.

B-树和B+树

上述顺序查找、二分查找、二叉查找树都是在内存中进行的,它们适用于较小的文件,而对于大文件,存放在外部存储器上的文件就不适用。对于较大规模的文件,即使用采用平衡二叉树,查找效率还是比较低。例如:外存中10亿条记录组织为平衡二叉树,每次访问记录约访问30次(log2(10^10)外存;而使用256阶的B-树数据,每次访问记录需要4到5次。

1. B-树定义

B-树是一种平衡的多路查找树。在文件系统中,B-树已经成为索引文件的一种有效结构。对于m(m>=3)阶B-树,或为空树,或为满足下列特征的m叉树。

(1) 树中每个结点至多有m棵子树。

(2) 若根结点不是叶子结点,则至少有两棵子树。

(3) 所有的非终端结点关键字递增,K[i] < k[i+1]

(4)  除根结点外所有非终端结点至少有`不大于`m/2棵子树,即每个非根结点至少有`不大于`m/2-1个关键字。

(5) 所有叶子结点都出现在同一层次上,并且不带信息。

需要注意的是,B-树经常应用于外部文件的查找,在查找过程中,某些子树并未常驻内存,因此在查找过程中需要从外存读入到内存,读盘次数与待查找的结点在树中的层次有关,但至多不会超过树的深度,而在内存中查找所需的时间与结点中关键字个数密切相关。

  1. B+树

    B树分为B-树和B+树,两者结构大致相同,这里不细说。需要说明的差异是:

    (1) B+树中所有叶子结点包含了全部关键字及指向对应记录的指针,且所有叶子结点按关键字值从小到大顺序依次链接。

    (2) B+树中所有的非叶子结点仅起到索引的作用,即结点中每个索引项只含有对应子树的最大关键字值从小到大的顺序依次链接。

红黑树

1. 定义:红黑树,又称为“对称二叉B树”,是一种自平衡的二叉查找树。它能在O(log2N)时间 内完成查找、插入、和删除操作。红黑树每个节点都有红色或黑色。可以把红黑树视为一棵扩充的二叉树,用外部结点表示空指针。红黑树除了具有二叉排序树的所有性质之外,还具有以下3点性质:

(1)  根结点和所有外部结点的颜色都是黑色的。

(2)  从根结点到外部结点的所有路径上没有两个连续的红色结点。

(3)  从根结点到外部结点的所有路径上都包含相同数目的黑色结点。

2. 红黑树的查找 

由于每一棵红黑树都是一棵二叉排序树,因此对红黑树进行查找时,可以使用普通二叉排序树的查找算法,其算法复杂度为O(h),h为二叉树的深度,最坏时间复杂度为O(n),但是由于红黑树加上了着色相关的性质,所以最坏时间复杂度为O(log2n),优于普通二叉树。
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/joson793847469/article/details/52281362
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞