红黑树总结
来源:互联网 发布:静默安装软件 编辑:程序博客网 时间: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.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
未完待续…
阅读全文
0 0
- 【算法总结】红黑树总结
- 红黑树总结
- 红黑树总结
- 红黑树总结
- 红黑树总结
- 红黑树总结
- 红黑树实现总结
- 红黑树的总结
- 红黑树简要总结
- 总结
- 总结
- 总结
- 总结
- 总结!
- 总结
- 总结.
- 总结。
- 总结
- 详解Android中Handler的使用方法
- Python学习之面向对象(class)
- 三星专业级360度视频拍摄设备登场,能直接传输3D VR视频
- Bootstrap与EasyUI入门
- oracle关联查询语句整理
- 红黑树总结
- print、println、printf的区别
- IDEA PermGen space内存溢出
- C++之树的层序遍历和深度优先遍历(先序遍历)(14)---《那些奇怪的算法》
- IO 流
- 安卓color属性大全
- 定时任务
- 怎么java代码打包成可执行jar并用批处理bat运行
- 404 | 为改bug祭出大招——女仆装?萝莉装?还是……?