# HG changeset patch # User tatsuki # Date 1428332706 -32400 # Node ID 97225df15574541e9bbeed746b11e0c356fac409 # Parent 6c3147a90b56d35aafa4c09fb2d0b229ea86e6a2 delete bag fix diff -r 6c3147a90b56 -r 97225df15574 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 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/BlackNode.java Tue Apr 07 00:05:06 2015 +0900 @@ -183,18 +183,17 @@ cur = cur.right(); } - Node leftSubTreeNode = new EmptyNode<>(); if (this.left().right().exitNode()) { //左の部分木が右の子を持っているか - leftSubTreeNode = this.left().deleteSubTreeMaxNode(this);//最大値を削除した左の部分木を返す。rootはthisと同じ。 + Node leftSubTreeNode = this.left().deleteSubTreeMaxNode(null);//最大値を削除した左の部分木を返す。rootはthisと同じ。 Node newParent = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); //rootをcurと入れ替えることでNodeの削除は完了する newNode = leftSubTreeNode.deleteBalance(newParent); return newNode; } else { - leftSubTreeNode = this.left().replaceNode(this);//右の子がいなかった場合、左の子を昇格させるだけで良い。 - Node newParent = this.createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); + Node leftSubTreeNode = this.left().replaceNode(this);//右の子がいなかった場合、左の子を昇格させるだけで良い。 + Node newParent = createNode(this.left().getKey(), this.left().getValue(), leftSubTreeNode, this.right()); return leftSubTreeNode.deleteBalance(newParent); } @@ -202,17 +201,4 @@ } - public Node deleteSubTreeMaxNode(Node parent) { - - if (!right().right().exitNode()) { - Node node = right().replaceNode(this).deleteBalance(this); //怪しい地点 - return node; - - } - - Node node = right().deleteSubTreeMaxNode(this); - if (parent == null) - return node; - return node.deleteBalance(parent); - } } diff -r 6c3147a90b56 -r 97225df15574 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/EmptyNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/EmptyNode.java Mon Apr 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/EmptyNode.java Tue Apr 07 00:05:06 2015 +0900 @@ -123,8 +123,4 @@ return count; } - @Override - public Node deleteSubTreeMaxNode(Node parent) { - return this; - } } diff -r 6c3147a90b56 -r 97225df15574 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 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/Node.java Tue Apr 07 00:05:06 2015 +0900 @@ -112,7 +112,24 @@ } - public abstract Node deleteSubTreeMaxNode(Node parent) ; + public Node deleteSubTreeMaxNode(Node parent) { + + Node node; + if (right().exitNode()) {//最大値のノードが取得できるまで潜る + node = right().deleteSubTreeMaxNode(this); + if (parent == null) + return node; + return node.deleteBalance(parent); + + } + + + node = this.replaceNode(parent); //怪しい地点 + if (parent == null) + return node; + return node.deleteBalance(parent); + + } public void setRebuildFlag(boolean flag) { this.rebuildFlag = flag; @@ -211,8 +228,6 @@ } - - protected abstract boolean exitNode(); public abstract Node createNode(K key, V value, Node left, Node right); diff -r 6c3147a90b56 -r 97225df15574 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 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/RedNode.java Tue Apr 07 00:05:06 2015 +0900 @@ -32,9 +32,9 @@ public Node deleteBalance(Node parent) { if (0 > (parent.getKey().hashCode() - this.getKey().hashCode())) - return createNode(parent.getKey(), parent.getValue(), parent.left(), this); + return parent.createNode(parent.getKey(), parent.getValue(), parent.left(), this); else - return createNode(parent.getKey(), parent.getValue(), this, parent.right()); + return parent.createNode(parent.getKey(), parent.getValue(), this, parent.right()); } @Override @@ -118,35 +118,19 @@ Node leftSubTreeNode = new EmptyNode<>(); if (this.left().right().exitNode()) { - leftSubTreeNode = this.left().deleteSubTreeMaxNode(this); - newNode = cur.createNode(cur.getKey(), cur.getValue(), leftSubTreeNode.left(), leftSubTreeNode.right()); + leftSubTreeNode = this.left().deleteSubTreeMaxNode(null); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); return leftSubTreeNode.deleteBalance(newNode); } else { leftSubTreeNode = this.left().replaceNode(this); - newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode.left(), this.right()); + newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.right()); return leftSubTreeNode.deleteBalance(newNode); } } } - public Node deleteSubTreeMaxNode(Node parent) { - - if (!right().right().exitNode()) { - Node node = right().replaceNode(this); //怪しい地点 - if (parent == null) - return node; - return node; - - } - - Node node = right().deleteSubTreeMaxNode(this); - if (parent == null) - return node; - return node.deleteBalance(parent); - } - @Override protected int checkBlackCount(int count) { // test method diff -r 6c3147a90b56 -r 97225df15574 src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java Mon Apr 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java Tue Apr 07 00:05:06 2015 +0900 @@ -66,5 +66,6 @@ public void checkBlackCount(){ root.checkBlackCount(0); + System.out.println("-----------------------------------"); } } diff -r 6c3147a90b56 -r 97225df15574 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 06 22:35:12 2015 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/test/TreeMapDelete.java Tue Apr 07 00:05:06 2015 +0900 @@ -13,17 +13,17 @@ public class TreeMapDelete { public static void main(String args[]) { TreeMap map = new TreeMap(); - for (int count = 1; count < 15; count++) { + for (int count = 1; count < 200; count++) { map = map.put(count, count); } ArrayList list = new ArrayList(); - for (int i = 1; i < 15; i++) { + for (int i = 1; i < 200; i++) { list.add(i); } - test(map); + // test(map); Collections.shuffle(list); for (Integer num : list) { @@ -31,7 +31,6 @@ TreeMap newMap = map.delete(num); map = newMap; map.checkBlackCount(); - System.out.println("-----------------------------------"); } for (Integer num : list) { System.out.println(num); @@ -41,33 +40,43 @@ } public static void test(TreeMap map) { - TreeMap neMap = map.delete(9); + TreeMap neMap = map.delete(11); + neMap.checkBlackCount(); + neMap = neMap.delete(2); neMap.checkBlackCount(); - neMap = neMap.delete(4); + neMap = neMap.delete(8); + neMap.checkBlackCount(); + neMap = neMap.delete(6); neMap.checkBlackCount(); neMap = neMap.delete(5); neMap.checkBlackCount(); - neMap = neMap.delete(14); - neMap.checkBlackCount(); - neMap = neMap.delete(11); - neMap.checkBlackCount(); neMap = neMap.delete(3); neMap.checkBlackCount(); neMap = neMap.delete(12); neMap.checkBlackCount(); - neMap = neMap.delete(8); + neMap = neMap.delete(16); + neMap.checkBlackCount(); + neMap = neMap.delete(13); + neMap.checkBlackCount(); + neMap = neMap.delete(17); neMap.checkBlackCount(); - neMap = neMap.delete(2); + neMap = neMap.delete(19); + neMap.checkBlackCount(); + neMap = neMap.delete(4); + neMap.checkBlackCount(); + neMap = neMap.delete(7); + neMap.checkBlackCount(); + neMap = neMap.delete(1); neMap.checkBlackCount(); neMap = neMap.delete(10); neMap.checkBlackCount(); - neMap = neMap.delete(1); + neMap = neMap.delete(14); neMap.checkBlackCount(); - neMap = neMap.delete(13); + neMap = neMap.delete(9); neMap.checkBlackCount(); - neMap = neMap.delete(6); + neMap = neMap.delete(15); neMap.checkBlackCount(); - neMap = neMap.delete(7); + neMap = neMap.delete(18); neMap.checkBlackCount();