# HG changeset patch # User tatsuki # Date 1430212377 -32400 # Node ID a02ce8467bad101cd431ee4956fa9ee1cceff0a1 # Parent ab026848665ae6790302fbe95bd6d33a7cede5b8 refactoring diff -r ab026848665a -r a02ce8467bad src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/BlackNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/BlackNode.java Mon Apr 27 23:08:57 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/BlackNode.java Tue Apr 28 18:12:57 2015 +0900 @@ -88,7 +88,6 @@ */ @Override public Node replaceNode(Node parent) throws RotateParent { - Node newNode = null; if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する return deleteNode();//黒が1つ減るので木のバランスを取る @@ -126,15 +125,10 @@ return newParent; } catch (RotateParent e) { Node node = e.getParent(); - //if (parent != null) { Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); return node.deleteBalance(newParent); - // } - // return node; } } } - } - } diff -r ab026848665a -r a02ce8467bad src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/Node.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/Node.java Mon Apr 27 23:08:57 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/Node.java Tue Apr 28 18:12:57 2015 +0900 @@ -107,7 +107,6 @@ return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), node); else return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); - } if (side == Rotate.L) return parent.createNode(parent.getKey(), parent.getValue(), node, parent.right()); @@ -126,26 +125,17 @@ public Node deleteSubTreeMaxNode(Node parent, Rotate side) throws RotateParent { Node node; - if (right().isNotEmpty()) {//最大値のノードが取得できるまで潜る - try { + try { + if (right().isNotEmpty()) {//最大値のノードが取得できるまで潜る node = right().deleteSubTreeMaxNode(this, Rotate.R); - // return node; - } catch (RotateParent e) { - node = e.getParent(); - if (parent == null) - throw e; - return node.deleteBalance(parent); + } else { + node = this.replaceNode(parent); } - } else { - try { - node = this.replaceNode(parent); - // return node; - } catch (RotateParent e) { - node = e.getParent(); - if (parent == null) - throw e; - return node.deleteBalance(parent); - } + } catch (RotateParent e) { + node = e.getParent(); + if (parent == null) + throw e; + return node.deleteBalance(parent); } if (parent == null) return node; diff -r ab026848665a -r a02ce8467bad src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/RedNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/RedNode.java Mon Apr 27 23:08:57 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/RedNode.java Tue Apr 28 18:12:57 2015 +0900 @@ -36,26 +36,19 @@ @Override Rotate checkRotate(Rotate side) { - if (side == L) { if (left.isRed()) return R; - else if (right.isRed()) return LR; - return N; } else { - if (left.isRed()) return RL; - else if (right.isRed()) return L; - return N; } - } @Override @@ -65,19 +58,15 @@ @Override public Node replaceNode(Node parent) throws RotateParent { - Node newNode = null; if (!this.left().isNotEmpty() && !this.right().isNotEmpty()) { //自身を削除する return deleteNode(); - } else if (this.left().isNotEmpty() && !this.right().isNotEmpty()) { //左の部分木を昇格させる newNode = left().createNode(left().getKey(), left().getValue(), left().left(), left().right()); return newNode; - } else if (!this.left().isNotEmpty() && this.right().isNotEmpty()) { //右の部分木を昇格させる newNode = right().createNode(right().getKey(), right().getValue(), right().left(), right().right()); return newNode; - } else {//子ノードが左右にある場合 //左の部分木の最大の値を持つNodeと自身を置き換える Node cur = this.left(); @@ -85,9 +74,7 @@ while (cur.right().isNotEmpty()) { cur = cur.right(); } - Node leftSubTreeNode = null; - if (this.left().right().isNotEmpty()) { try { leftSubTreeNode = this.left().deleteSubTreeMaxNode(null,Rotate.L); @@ -105,11 +92,8 @@ return newNode; } catch (RotateParent e) { Node node = e.getParent(); - //if (parent != null) { Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); return node.deleteBalance(newParent); - // } - // return node; } } diff -r ab026848665a -r a02ce8467bad src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/test/TreeMapDelete.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/test/TreeMapDelete.java Mon Apr 27 23:08:57 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/test/TreeMapDelete.java Tue Apr 28 18:12:57 2015 +0900 @@ -14,12 +14,12 @@ public class TreeMapDelete { public static void main(String args[]) throws RotateParent { TreeMap map = new TreeMap(); - for (int count = 1; count < 10000; count++) { + for (int count = 1; count < 3000; count++) { map = map.put(count, count); } ArrayList list = new ArrayList(); - for (int i = 1; i < 10000; i++) { + for (int i = 1; i < 3000; i++) { list.add(i); }