diff src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java @ 24:77681539d7c1 default tip

add get keys , keys return TreeMap key Iterator
author tatsuki
date Wed, 06 May 2015 06:16:05 +0900
parents aa30cf7adec2
children
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java	Wed Apr 29 16:55:23 2015 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/tatsuki/TreeMap/TreeMap.java	Wed May 06 06:16:05 2015 +0900
@@ -3,7 +3,9 @@
 
 import org.junit.Test;
 
+import java.util.Iterator;
 import java.util.Optional;
+import java.util.Stack;
 
 
 /**
@@ -28,7 +30,9 @@
         this.size = size;
     }
 
-    public Optional<V> get(final K key) {return root.get(key);}
+    public Optional<V> get(final K key) {
+        return root.get(key);
+    }
 
     public TreeMap put(K key, V value) {
 
@@ -40,7 +44,7 @@
             return new TreeMap<K, V>(newRoot, size + 1);
         }
 
-        Node<K, V> newEntry = root.put((Comparable<? super K>)key, value);
+        Node<K, V> newEntry = root.put((Comparable<? super K>) key, value);
         Node<K, V> newRoot = new BlackNode(newEntry.getKey(), newEntry.getValue(), newEntry.left(), newEntry.right());
         return new TreeMap(newRoot, 0);
     }
@@ -51,19 +55,60 @@
     }
 
 
-    public TreeMap<K,V> delete(K key) throws RotateParent {
-       Node node = root.delete((Comparable<? super K>)key, null,Rotate.N);
+    public TreeMap<K, V> delete(K key) {
+        Node node = null;
+        try {
+            node = root.delete((Comparable<? super K>) key, null, Rotate.N);
+        } catch (RotateParent rotateParent) {
+        }
         if (node == null)
             return this; // not key
         if (!node.isNotEmpty())
-            return new TreeMap(new EmptyNode<>(),0);
-        Node newRoot = new BlackNode(node.getKey(),node.getValue(),node.left(),node.right());
-        return new TreeMap(newRoot,0);
+            return new TreeMap(new EmptyNode<>(), 0);
+        Node newRoot = new BlackNode(node.getKey(), node.getValue(), node.left(), node.right());
+        return new TreeMap(newRoot, 0);
+    }
+
+    public Iterator<K> keys() {
+        return new Iterator<K>() {
+            Stack<Node> nodeStack = new Stack();
+            Node currentNode = root;
+
+            @Override
+            public boolean hasNext() {
+                return currentNode != null;
+            }
+
+            @Override
+            public K next() {
+                K key = (K) currentNode.getKey();
+
+                if (currentNode.left().isNotEmpty()) {
+                    nodeStack.push(currentNode);
+                    currentNode = currentNode.left();
+                    return key;
+                } else  if (currentNode.right().isNotEmpty()) {
+                    currentNode = currentNode.right();
+                    return key;
+                } else if (nodeStack.isEmpty()) {
+                    currentNode = null;
+                    return key;
+                }
+
+                do {
+                    currentNode = nodeStack.pop().right();
+                    if (currentNode.isNotEmpty())
+                        return key;
+
+                } while (!nodeStack.isEmpty());
+                return key;
+            }
+        };
     }
 
     @Test
-    public void checkDepth(){
-        root.checkDepth(0,0);
+    public void checkDepth() {
+        root.checkDepth(0, 0);
         System.out.println("-----------------------------------");
     }
 }