java 红黑树_Java实现红黑树

1 packagecom.example.lenovo.linehough;2

3 public classGRBTree {4 intiCount;5 int[] treeValue;6 GRBTreeNode root;7 boolean BLACK = false;8 boolean RED = true;9

10 publicGRBTree() {11 root = null;12 }13

14 public GRBTree(inti) {15 Free();16 }17

18 public classGRBTreeNode {19 intkey;20 booleancolor;21 GRBTreeNode left, right, parent;22

23 public GRBTreeNode(int newKey, booleannewColor, GRBTreeNode newLeft, GRBTreeNode newRight) {24 key =newKey;25 color =newColor;26 left =newLeft;27 right =newRight;28 if (left != null)29 left.parent = this;30 if (right != null)31 right.parent = this;32 parent = null;33 }34

35 publicGRBTreeNode() {36 if (left != null)37 left = null;38 if (right != null)39 right = null;40 }41 }42

43 voidFree() {44 if (root != null)45 root = null;46 }47

48 voidDereference() {49 root = null;50 }51

52 publicGRBTreeNode Grandparent(GRBTreeNode n) {53 if (n == null || n.parent == null)54 return null;55 returnn.parent.parent;56 }57

58 publicGRBTreeNode Sibling(GRBTreeNode n) {59 if (n == null || n.parent == null)60 return null;61 if (n ==n.parent.left)62 returnn.parent.right;63 else

64 returnn.parent.left;65 }66

67 publicGRBTreeNode Uncle(GRBTreeNode n) {68 if (n == null)69 return null;70 returnSibling(n.parent);71 }72

73 booleanColorOf(GRBTreeNode n) {74 return n == null ?BLACK : n.color;75 }76

77 public GRBTreeNode Find(intkeyToFind) {78 GRBTreeNode n =root;79 while (n != null) {80 if (keyToFind ==n.key)81 returnn;82 if (keyToFind

85 n =n.right;86 }87 returnn;88 }89

90 voidReplace(GRBTreeNode oldNode, GRBTreeNode newNode) {91 if (oldNode.parent == null)92 root =newNode;93 else{94 if (oldNode ==oldNode.parent.left)95 oldNode.parent.left =newNode;96 else

97 oldNode.parent.right =newNode;98 }99 if (newNode != null)100 newNode.parent =oldNode.parent;101 }102

103 voidRotateLeft(GRBTreeNode n) {104 GRBTreeNode r =n.right;105 Replace(n, r);106 n.right =r.left;107 if (r.left != null)108 r.left.parent =n;109 r.left =n;110 n.parent =r;111 }112

113 voidRotateRight(GRBTreeNode n) {114 GRBTreeNode l =n.left;115 Replace(n, l);116 n.left =l.right;117 if (l.right != null)118 l.right.parent =n;119 l.right =n;120 n.parent =l;121 }122

123 voidInsert1(GRBTreeNode n) {124 if (n.parent == null)125 n.color =BLACK;126 else

127 Insert2(n);128 }129

130 voidInsert2(GRBTreeNode n) {131 if (n.parent.color !=BLACK)132 Insert3(n);133 }134

135 voidInsert3(GRBTreeNode n) {136 GRBTreeNode u =Uncle(n);137 GRBTreeNode g =Grandparent(n);138 if (ColorOf(u) ==RED) {139 n.parent.color =BLACK;140 u.color =BLACK;141 g.color =RED;142 Insert1(g);143 } else

144 Insert4(n);145 }146

147 voidInsert4(GRBTreeNode n) {148 GRBTreeNode g =Grandparent(n);149 if (n == n.parent.right && n.parent ==g.left) {150 RotateLeft(n.parent);151 n =n.left;152 } else if (n == n.parent.left && n.parent ==g.right) {153 RotateRight(n.parent);154 n =n.right;155 }156 Insert5(n);157 }158

159 voidInsert5(GRBTreeNode n) {160 GRBTreeNode g =Grandparent(n);161 n.parent.color =BLACK;162 g.color =RED;163 if (n == n.parent.left && n.parent ==g.left)164 RotateRight(g);165 else

166 RotateLeft(g);167 }168

169 boolean Insert(intnewKey) {170 GRBTreeNode insNode = new GRBTreeNode(newKey, RED, null, null);171 GRBTreeNode n;172

173 if (root == null)174 root =insNode;175 else{176 n =root;177 while (true) {178 if (newKey ==n.key) {179 return false;180 }181

182 if (newKey

187 n =n.left;188 } else{189 if (n.right == null) {190 n.right =insNode;191 break;192 } else

193 n =n.right;194 }195 }196 insNode.parent =n;197 }198

199 Insert1(insNode);200

201 return true;202 }203

204 publicGRBTreeNode Maximum(GRBTreeNode n) {205 if (n == null)206 return null;207

208 while (n.right != null)209 n =n.right;210 returnn;211 }212

213 publicGRBTreeNode Minimum(GRBTreeNode n) {214 if (n == null)215 return null;216

217 while (n.left != null)218 n =n.left;219 returnn;220 }221

222 voidDelete1(GRBTreeNode n) {223 if (n.parent != null)224 Delete2(n);225 }226

227 voidDelete2(GRBTreeNode n) {228 GRBTreeNode s =Sibling(n);229

230 if (ColorOf(s) ==RED) {231 n.parent.color =RED;232 s.color =BLACK;233

234 if (n ==n.parent.left) {235 RotateLeft(n.parent);236 } else{237 RotateRight(n.parent);238 }239 }240 Delete3(n);241 }242

243 voidDelete3(GRBTreeNode n) {244 GRBTreeNode s =Sibling(n);245

246 if (ColorOf(n.parent) == BLACK && ColorOf(s) == BLACK &&

247 ColorOf(s.left) == BLACK && ColorOf(s.right) ==BLACK) {248 s.color =RED;249 Delete1(n.parent);250 } else

251 Delete4(n);252 }253

254 voidDelete4(GRBTreeNode n) {255 GRBTreeNode s =Sibling(n);256

257 if (ColorOf(n.parent) == RED && ColorOf(s) == BLACK &&

258 ColorOf(s.left) == BLACK && ColorOf(s.right) ==BLACK) {259 s.color =RED;260 n.parent.color =BLACK;261 } else

262 Delete5(n);263 }264

265 voidDelete5(GRBTreeNode n) {266 GRBTreeNode s =Sibling(n);267

268 if (n == n.parent.left &&

269 ColorOf(s) == BLACK && ColorOf(s.left) == RED && ColorOf(s.right) ==BLACK) {270 s.color =RED;271 s.left.color =BLACK;272 RotateRight(s);273 } else if (n == n.parent.right &&

274 ColorOf(s) == BLACK && ColorOf(s.right) == RED && ColorOf(s.left) ==BLACK) {275 s.color =RED;276 s.right.color =BLACK;277 RotateLeft(s);278 }279 Delete6(n);280 }281

282 voidDelete6(GRBTreeNode n) {283 GRBTreeNode s =Sibling(n);284

285 s.color =ColorOf(n.parent);286 n.parent.color =BLACK;287 if (n ==n.parent.left) {288 s.right.color =BLACK;289 RotateLeft(n.parent);290 } else{291 s.left.color =BLACK;292 RotateRight(n.parent);293 }294 }295

296 void Delete(intkeyToDel) {297 GRBTreeNode c;298 GRBTreeNode n =Find(keyToDel);299 if (n == null)300 return;301

302 if (n.left != null && n.right != null) {303 GRBTreeNode pred =Maximum(n.left);304 n.key =pred.key;305 n =pred;306 }307

308 c = n.right == null ?n.left : n.right;309 if (ColorOf(n) ==BLACK) {310 n.color =ColorOf(c);311 Delete1(n);312 }313 Replace(n, c);314 if (n.parent == null && c != null)315 c.color =BLACK;316

317 n.left = null;318 n.right = null;319 }320

321 /*前序遍历的结果放到一个数组里面*/

322 private void preOrder(GRBTreeNode n, int width, intheight) {323

324 if (n != null) {325 treeValue[iCount] =n.key;326 iCount++;327 preOrder(n.left, width, height);328 preOrder(n.right, width, height);329 }330

331 }332

333 public int[] preOrder(int width, intheight) {334 treeValue = new int[width *height];335 iCount = 0;336 preOrder(root, width, height);337 returntreeValue;338 }339

340 public intgetiCount() {341 returniCount;342 }343 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值