数据库底层结构红黑树-二叉树-B树

数据库底层结构红黑树-二叉树-B树

图解地址:http://www.360doc.com/content/18/0904/19/25944647_783893127.shtml

学习这些树之前 先了解一下 二叉树:
二叉树分为四种:
1.满二叉树,从高到低,除了叶节点外,所以节点左右节点都存在。【高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树。 】
2.完全二叉树,比满二叉树少几个叶节点,从左向右放子节点。【最底层的少几个节点 】
3.平衡二叉树,空树或者它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也都是平衡树。
4.二叉搜索树,空树或者二叉树的所有节点比他的左子节点大,比他的右子节点小【就是每个节点的子树 左小右大】

树的特点:
(01) 每个节点有零个或多个子节点;
(02) 没有父节点的节点称为根节点;
(03) 每一个非根节点有且只有一个父节点;
(04) 除了根节点外,每个子节点可以分为多个不相交的子树。

树的基本术语:
一棵树当中没有子结点(即度为0)的结点,称为叶子结点,简称“叶子”。 叶子是指度为0的结点,又称为终端结点。
结点的度:结点拥有的子树的数目。
叶子:度为零的结点。
分支结点:度不为零的结点。
树的度:树中结点的最大的度。

层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1。
树的高度:树中结点的最大层次。
无序树:如果树中结点的各子树之间的次序是不重要的,可以交换位置。
有序树:如果树中结点的各子树之间的次序是重要的, 不可以交换位置。
森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。

二叉树的用途:
排序有快速排序归并排序查找有二分法,甚至直接遍历查找,二叉树的使用很少。
实际场景使用上,用的最多的是二叉平衡树,有种特殊的二叉平衡树就是红黑树,Java集合中的TreeSet和TreeMap,C++STL中的set,map以及LInux虚拟内存的管理,都是通过红黑树去实现的,还有哈弗曼树编码方面的应用,以及B-Tree,B±Tree在文件系统中的应用。当然二叉查找树可以用来查找和排序。

mysql 底层数据结构  使用的是 b-tree,hbase  底层数据结构使用的是

Binary Search Tree(二分查找树)
定义:A BST is a binary tree in symmetric order.
在java的实现中,每个节点(Node)由四个域组成:key,value,left,right。即:键,值,左子树,右子树。

private class Node {
    private Key key;
    private Value val;
    private Node left, right;

    public Node(Key key, Value val) {
        this.key = key;
        this.val = val;
    }
}

二进制查找树
查找:得到相应键的值,若无此键则返回null.

/* 查找 */
public Value get(Key key) {
    Node x = root;
    while (x != null) {
        int cmp = key.compareTo(x.key);
        if (cmp < 0) {
            x = x.left;
        } else if (cmp > 0) {
            x = x.right;
        } else { // if (cmp == 0)
          return x.val;
        }
    }
    return null;
}

插入:如果小,往左;如果大,往右;如果null,插入;如果存在,覆盖。

/* 插入 */
public void put(Key key, Value val) {
    root = put(root, key, val);
}

/* 辅助函数,递归调用 */
private Node put(Node x, Key key, Value val) {
    if (x == null) return new Node(key, val);
    int cmp = key.compareTo(x.key);
    if (cmp < 0) {
        x.left = put(x.left, key, val);
    } else if (cmp > 0) {
        x.right = put(x.right, key, val);
    } else { // if (cmp == 0)
        x.val = val;
    }
    return x;
}

红黑树对应2-3树
红黑树的java表示

private static final boolean RED = true;
private static final boolean BLACK = false;

private class Node {
    Key key;
    Value val;
    Node left, right;
    boolean color;// color of parent link
}

private boolean isRed(Node x) {
    if (x == null) return false;
    return x.color == RED;
}

红黑树 介绍:

在这里插入图片描述

红黑树插入过程中可能用到的三个基本操作(左转,右转,变色):
左转-右转-变色

left rotate
right rotate
flip colors

红黑树 左转

/* left rotate */
private Node rotateLeft(Node h) {
   assert isRed(h.right);
   Node x = h.right;
   h.right = x.left;
   x.left = h;
   x.color = h.color;
   h.color = RED;
   return x;
}

红黑树 右转

/* right rotate */
private Node rotateRight(Node h) {
    assert isRed(h.left);
    Node x = h.left;
    h.left = x.right;
    x.right = h;
    x.color = h.color;
    h.color = RED;
    return x;
}

红黑树 变色

/* flip colors */
private void flipColors(Node h) {
    assert !isRed(h);
    assert isRed(h.left);
    assert isRed(h.right);
    h.color = RED;
    h.left.color = BLACK;
    h.right.color = BLACK;
}

B-Trees(B树)
最后简单提一下B树,就是将2-3树一般化,将每个节点的key-link pairs增加到 M - 1

At least 2 key-link pairs at root.
At least M / 2 key-link pairs in other nodes.
External nodes contain client keys.
Internal nodes contain copies of keys to guide search.

在B树中查找

Start at root.
Find interval for search key and take corresponding link.
Search terminates in external node.

在B树中插入

Search for new key.
Insert at bottom.
Split nodes with M key-link pairs on the way up the tree.

待会总结 先看学习资料
学习网址:https://blog.csdn.net/h3243212/article/details/52819734

发布了105 篇原创文章 · 获赞 87 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zengxianglei/article/details/94357062