红黑树深入剖析及Java实现资料.docx

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
红黑树深入剖析及Java实现在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。作者:振兴来源:振兴|2016-12-08 11:01?收藏??分享?红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。BST二叉查找树(Binary Search Tree,简称BST)是一棵二叉树,它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。它的高度决定了它的查找效率。在理想的情况下,二叉查找树增删查改的时间复杂度为O(logN)(其中N为节点数),最坏的情况下为O(N)。当它的高度为logN+1时,我们就说二叉查找树是平衡的。BST的查找操作T??key?=?a?search?key?Node?root?=?point?to?the?root?of?a?BST??while(true){?????if(root==null){?????????break;?????}?????if(root.value.equals(key)){?????????return?root;?????}?????else?if(pareTo(root.value)0){?????????root?=?root.left;?????}?????else{?????????root?=?root.right;?????}?}?return?null;?从程序中可以看出,当BST查找的时候,先与当前节点进行比较:如果相等的话就返回当前节点;如果少于当前节点则继续查找当前节点的左节点;如果大于当前节点则继续查找当前节点的右节点。直到当前节点指针为空或者查找到对应的节点,程序查找结束。BST的插入操作Node?node?=?create?a?new?node?with?specify?value?Node?root?=?point?the?root?node?of?a?BST?Node?parent?=?null;??//find?the?parent?node?to?append?the?new?node?while(true){????if(root==null)break;????parent?=?root;????if(pareTo(root.value)=0){???????root?=?root.left;??????}else{???????root?=?root.right;????}??}?if(parent!=null){????if(pareTo(parent.value)=0){//append?to?left???????parent.left?=?node;????}else{//append?to?right???????parent.right?=?node;????}?}?插入操作先通过循环查找到待插入的节点的父节点,和查找父节点的逻辑一样,都是比大小,小的往左,大的往右。找到父节点后,对比父节点,小的就插入到父节点的左节点,大就插入到父节点的右节点上。BST的删除操作删除操作的步骤如下:查找到要删除的节点。如果待删除的节点是叶子节点,则直接删除。如果待删除的节点不是叶子节点,则先找到待删除节点的中序遍历的后继节点,用该后继节点的值替换待删除的节点的值,然后删除后继节点。BST存在的问题BST存在的主要问题是,数在插入的时候会导致树倾斜,不同的插入顺序会导致树的高度不一样,而树的高度直接的影响了树的查找效率。理想的高度是logN,最坏的情况是所有的节点都在一条斜线上,这样的树的高度为N。RBTree基于BST存在的问题,一种新的树——平衡二叉查找树(Balanced BST)产生了。平衡树在插入和删除的时候,会通过旋转操作将高度保持在logN。其中两款具有代表性的平衡树分别为AVL树和红黑树。AVL树由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如红黑树。红黑树(Red-Black Tree,以下简称RBTree)的实际应用非常广泛,比如Linux内核中的完全公平调度器、高精度计时器、ext3文件系统等等,各种语言的函数库如Java的TreeMap和TreeSet,C++ STL的map、multimap、multiset等。RBTree也是函数式语言中最常用的持久数据结构之一,在计算几何中也有重要作用。值得一提的是,Java 8中HashMap的实现也因为用RBTree取代链表,性能有所提升。RBTree的定义RBTree的定义如下:任何一个节点都有颜色,黑色或者红色根节点是黑色的父子节点之间不能出现两个连续的红节点任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档