`
yanlijun250
  • 浏览: 750414 次
文章分类
社区版块
存档分类
最新评论

算法之红黑树

 
阅读更多
  1. packagecom.eshore.sweetop.dataframe;
  2. importcom.eshore.sweetop.data.KeyData;
  3. importcom.eshore.sweetop.data.Node;
  4. importcom.eshore.sweetop.data.RBNode;
  5. publicclassRBTree{
  6. privateRBNoderoot;
  7. privatestaticfinalRBNodeNIL=RBNode.getRBNode();
  8. publicRBTree(){
  9. root=NIL;
  10. }
  11. publicvoidinsert(RBNodenode){
  12. RBNodey=NIL;
  13. RBNodex=root;
  14. while(x!=NIL){
  15. y=x;
  16. if(node.getData().getKey()<x.getData().getKey()){
  17. x=x.getLeft();
  18. }else{
  19. x=x.getRight();
  20. }
  21. }
  22. node.setParent(y);
  23. if(y==NIL){
  24. root=node;
  25. }elseif(node.getData().getKey()<y.getData().getKey()){
  26. y.setLeft(node);
  27. }else{
  28. y.setRight(node);
  29. }
  30. node.setLeft(NIL);
  31. node.setRight(NIL);
  32. node.setColor(RBNode.RED);
  33. insertFixup(node);
  34. }
  35. publicvoiddelete(RBNodenode){
  36. RBNodetempy=NIL,tempx=NIL;
  37. if(node.getLeft()==NIL||node.getRight()==NIL){
  38. tempy=node;
  39. }else{
  40. tempy=successor(node);
  41. }
  42. if(tempy.getLeft()!=NIL){
  43. tempx=tempy.getLeft();
  44. }else{
  45. tempx=tempy.getRight();
  46. }
  47. tempx.setParent(tempy.getParent());
  48. if(tempy.getParent()==NIL){
  49. root=tempx;
  50. }elseif(tempy==tempy.getParent().getLeft()){
  51. tempy.getParent().setLeft(tempx);
  52. }else{
  53. tempy.getParent().setRight(tempx);
  54. }
  55. if(tempy!=node){
  56. node.setData(tempy.getData());
  57. }
  58. if(tempy.getColor()==RBNode.BLACK){
  59. deleteFixup(tempx);
  60. }
  61. }
  62. privatevoiddeleteFixup(RBNodenode){
  63. RBNode tempw=NIL;
  64. while(node!=root && node.getColor()==RBNode.BLACK){
  65. if(node==node.getParent().getLeft()){
  66. tempw=node.getParent().getRight();
  67. if(tempw.getColor()==RBNode.RED){
  68. tempw.setColor(RBNode.BLACK);
  69. node.getParent().setColor(RBNode.RED);
  70. leftRotate(node.getParent());
  71. tempw=node.getParent().getRight();
  72. }
  73. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK){
  74. tempw.setColor(RBNode.RED);
  75. node=node.getParent();
  76. }else{
  77. if(tempw.getRight().getColor()==RBNode.BLACK){
  78. tempw.getLeft().setColor(RBNode.BLACK);
  79. tempw.setColor(RBNode.RED);
  80. rightRotate(tempw);
  81. }
  82. tempw.setColor(node.getParent().getColor());
  83. node.getParent().setColor(RBNode.BLACK);
  84. tempw.getRight().setColor(RBNode.BLACK);
  85. leftRotate(node.getParent());
  86. break;
  87. }
  88. }else{
  89. tempw=node.getParent().getLeft();
  90. if(tempw.getColor()==RBNode.RED){
  91. System.out.println("222");
  92. tempw.setColor(RBNode.BLACK);
  93. node.getParent().setColor(RBNode.RED);
  94. rightRotate(node.getParent());
  95. tempw=node.getParent().getLeft();
  96. }
  97. if(tempw.getLeft().getColor()==RBNode.BLACK && tempw.getRight().getColor()==RBNode.BLACK){
  98. tempw.setColor(RBNode.RED);
  99. node=node.getParent();
  100. }else{
  101. if(tempw.getLeft().getColor()==RBNode.BLACK){
  102. tempw.getRight().setColor(RBNode.BLACK);
  103. tempw.setColor(RBNode.RED);
  104. leftRotate(tempw);
  105. }
  106. tempw.setColor(node.getParent().getColor());
  107. node.getParent().setColor(RBNode.BLACK);
  108. tempw.getLeft().setColor(RBNode.BLACK);
  109. rightRotate(node.getParent());
  110. break;
  111. }
  112. }
  113. }
  114. node.setColor(RBNode.BLACK);
  115. }
  116. privatevoidleftRotate(RBNodenode){
  117. RBNodey=node.getRight();
  118. node.setRight(y.getLeft());
  119. if(y.getLeft()!=NIL){
  120. y.getLeft().setParent(node);
  121. }
  122. y.setParent(node.getParent());
  123. if(node.getParent()==NIL){
  124. root=y;
  125. }elseif(node==node.getParent().getLeft()){
  126. node.getParent().setLeft(y);
  127. }else{
  128. node.getParent().setRight(y);
  129. }
  130. y.setLeft(node);
  131. node.setParent(y);
  132. }
  133. privatevoidrightRotate(RBNodenode){
  134. RBNodex=node.getLeft();
  135. node.setLeft(x.getRight());
  136. if(x.getRight()!=NIL){
  137. x.getRight().setParent(node);
  138. }
  139. x.setParent(node.getParent());
  140. if(node.getParent()==NIL){
  141. root=x;
  142. }elseif(node==node.getParent().getLeft()){
  143. node.getParent().setLeft(x);
  144. }else{
  145. node.getParent().setRight(x);
  146. }
  147. x.setRight(node);
  148. node.setParent(x);
  149. }
  150. publicvoidinsertFixup(RBNodenode){
  151. RBNodey=NIL;
  152. while(node.getParent().getColor()==RBNode.RED){
  153. if(node.getParent()==node.getParent().getParent().getLeft()){
  154. y=node.getParent().getParent().getRight();
  155. if(y.getColor()==RBNode.RED){
  156. node.getParent().setColor(RBNode.BLACK);
  157. y.setColor(RBNode.BLACK);
  158. node.getParent().getParent().setColor(RBNode.RED);
  159. node=node.getParent().getParent();
  160. }else{
  161. if(node==node.getParent().getRight()){
  162. node=node.getParent();
  163. leftRotate(node);
  164. }
  165. node.getParent().setColor(RBNode.BLACK);
  166. node.getParent().getParent().setColor(RBNode.RED);
  167. rightRotate(node.getParent().getParent());
  168. }
  169. }else{
  170. y=node.getParent().getParent().getLeft();
  171. if(y.getColor()==RBNode.RED){
  172. node.getParent().setColor(RBNode.BLACK);
  173. y.setColor(RBNode.BLACK);
  174. node.getParent().getParent().setColor(RBNode.RED);
  175. node=node.getParent().getParent();
  176. }else{
  177. if(node==node.getParent().getLeft()){
  178. node=node.getParent();
  179. rightRotate(node);
  180. }
  181. node.getParent().setColor(RBNode.BLACK);
  182. node.getParent().getParent().setColor(RBNode.RED);
  183. leftRotate(node.getParent().getParent());
  184. }
  185. }
  186. }
  187. root.setColor(RBNode.BLACK);
  188. }
  189. publicvoidwalk(){
  190. walk(root);
  191. }
  192. privatevoidwalk(RBNodenode){
  193. if(node!=NIL){
  194. walk(node.getLeft());
  195. System.out.println(node.getData()+":"+node.getColor());
  196. walk(node.getRight());
  197. }
  198. }
  199. publicRBNodesearch(intk){
  200. RBNodenode=root;
  201. while(node!=NIL&&k!=node.getData().getKey()){
  202. if(k<node.getData().getKey()){
  203. node=node.getLeft();
  204. }else{
  205. node=node.getRight();
  206. }
  207. }
  208. returnnode;
  209. }
  210. publicRBNodemin(RBNodenode){
  211. while(node.getLeft()!=NIL){
  212. node=node.getLeft();
  213. }
  214. returnnode;
  215. }
  216. publicRBNodemin(){
  217. returnmin(root);
  218. }
  219. publicRBNodesuccessor(RBNodenode){
  220. if(node.getRight()!=NIL){
  221. returnmin(node.getRight());
  222. }
  223. RBNodey=node.getParent();
  224. while(y!=NIL&&node==y.getRight()){
  225. node=y;
  226. y=y.getParent();
  227. }
  228. returny;
  229. }
  230. publicRBNodemax(RBNodenode){
  231. while(node.getRight()!=NIL){
  232. node=node.getRight();
  233. }
  234. returnnode;
  235. }
  236. publicRBNodemax(){
  237. returnmax(root);
  238. }
  239. publicstaticvoidmain(String[]args){
  240. RBTreebt=newRBTree();
  241. int[]id={1,2,14,8,15,6,3};
  242. RBNodenode=null;
  243. for(inti=0;i<id.length;i++){
  244. node=newRBNode();
  245. node.setData(newKeyData(id[i]));
  246. bt.insert(node);
  247. }
  248. bt.walk();
  249. System.out.println("=====================");
  250. System.out.println("Root"+bt.root.getData());
  251. System.out.println("Max:"+bt.max().getData());
  252. System.out.println("Min:"+bt.min().getData());
  253. System.out.println(bt.search(8).getData());
  254. System.out.println(bt.successor(bt.search(8)).getData());
  255. bt.delete(bt.search(2));
  256. System.out.println("Root"+bt.root.getData());
  257. bt.walk();
  258. }
  259. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics