红黑树总结

来源:互联网 发布:静默安装软件 编辑:程序博客网 时间:2024/05/21 09:46

最近学习了红黑树,在这里总结一下,加深自己的理解.
在学习红黑树之前我们需要了解一个概念,BST(二叉查找树).

二叉查找树简介

二叉查找树有如下几个重要的性质:
1.若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
2.若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
3. 左、右子树也分别为二叉排序树;

下图就是一个普通的二叉搜索树
这里写图片描述
根据这些性质,我们可以很容易用代码实现一个简单的BST.

public class BST<Key extends Comparable<Key>, Value> {    private Node root;//二叉树的根节点    //定义结点的相关信息    private class Node{        private Key key;//结点的键        private Value val;//结点的值        private Node left, right;//当前结点的左孩子和右孩子        private int N;//以该结点为根的结点的总数        public Node(Key key, Value val, int N){            this.key = key;            this.val = val;            this.N = N;        }    }    //二叉搜索树的结点个数    public int size(){        return size(root);    }    private int size(Node x){        if( x == null)return 0;        else return x.N;    }    //获取键为key的结点值    public Value get(Key key){        return get(root,key);    }    private Value get(Node x, Key key){        if( x == null)return null;        //要查询的key与root的key比较        int cmp = key.compareTo(x.key);        //比root.key小在以左孩子为根节点的二叉树中查找        if(cmp < 0)return get(x.left, key);        //比root.key大在以右孩子为根节点的二叉树中查找        else if(cmp > 0)return get(x.right, key);        else return x.val;    }    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, 1);        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 x.val = val;//更新原来结点的val        x.N = size(x.left) + size(x.right) + 1;        return x;    }}

那我们仔细看看下面的两个图就会发现问题:
这是一个最坏的情况,树的深度为N
这里写图片描述
这是个最好的情况,树平衡的,根节点到叶子结点的距离都相同
这里写图片描述
小结:
优点:实现简单,能够进行有序性相关的操作
缺点:没有性能上界的保证,链接需要额外的空间

红黑树的简介

我们希望能够保持二分查找树的平衡性,在一颗含有N个结点的树中,我们希望树的高为lgN,但是在动态插入中保证树的完美平衡代价太高了,红黑树是相对是接近平衡的二叉树.
红黑树重要的几条性质:

1.每个节点或者是黑色,或者是红色。
2.根节点是黑色。
3.每个叶子节点(NIL)是黑色
4.如果一个节点是红色的,则它的子节点必须是黑色的。
5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

未完待续…

原创粉丝点击