Mercurial > hg > Members > tatsuki > TreeMap
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("-----------------------------------"); } }