The thought that counts
6 hours ago
next()
returns a generic value. For my binary tree iterator I knew there'd be times when I wanted to get the next Node instead of the value, so I extended the Iterator interface and added a next method that returned a Node<T>:package tree; import java.util.Iterator; public interface BinaryTreeIterator<T extends Comparable<T>> extends Iterator<T> { Node<T> nextNode(); }
package tree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Iterator; public abstract class AbstractBinaryTreeIterator<T extends Comparable<T>> implements BinaryTreeIterator<T> { public static final Log LOGGER = LogFactory.getLog(AbstractBinaryTreeIterator.class); public void remove() { throw new UnsupportedOperationException("cannot remove from a binary tree"); } public T next() { Node<T> nextNode = nextNode(); return nextNode.getValue(); } }
package tree; import java.util.NoSuchElementException; import java.util.Stack; public class PostOrderIterator<T extends Comparable<T>> extends AbstractBinaryTreeIterator<T> { protected Stack<Node<T>> stack = new Stack<Node<T>>(); public PostOrderIterator(BinaryTree<T> tree) { init(tree.getRoot()); } public void init(Node<T> root) { if (root != null) { stack.clear(); stackChildren(root); } } private void stackChildren(Node<T> node) { stack.push(node); Node<T> next = node.getRight(); if (next != null) { stackChildren(next); } next = node.getLeft(); if (next != null) { stackChildren(next); } } public Node<T> nextNode() { if (!hasNext()) { throw new NoSuchElementException(); } Node<T> x = null; if (!stack.empty()) { if (LOGGER.isDebugEnabled()) { LOGGER.debug(stack); } x = stack.pop(); } return x; } public boolean hasNext() { return !stack.isEmpty(); } }
package tree; import org.springframework.test.context.ContextConfiguration; import static org.testng.Assert.assertFalse; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; @Test @ContextConfiguration(locations = "classpath:app-context.xml, classpath:app-context-test.xml") public class BinaryTreeIteratorTest { public void testHasNextEmptyTree() { BinaryTree<String> empty = new BinaryTree<String>(); AbstractBinaryTreeIterator<String> iterator = new DepthFirstIterator<String>(empty); assertFalse(iterator.hasNext()); } @Test(expectedExceptions = UnsupportedOperationException.class) public void testRemove() { BinaryTree<String> empty = new BinaryTree<String>(); AbstractBinaryTreeIterator<String> iterator = new DepthFirstIterator<String>(empty); iterator.remove(); } public void testNextDepthFirst() { Integer[] data = {5, 3, 9, 1, 4, 6,}; BinaryTree<Integer> tree = new BinaryTree<Integer>(); tree.insert(data); String expected = "5,3,1,4,9,6,"; AbstractBinaryTreeIterator<Integer> iterator = new DepthFirstIterator<Integer>(tree); String actual = createCommaSeparatedString(iterator); assertEquals(actual.toString(), expected); } public void testNextPostOrder() { Integer[] data = {5, 3, 9, 1, 4, 6,}; BinaryTree<Integer> tree = new BinaryTree<Integer>(); tree.insert(data); String expected = "1,4,3,6,9,5,"; AbstractBinaryTreeIterator<Integer> iterator = new PostOrderIterator<Integer>(tree); String actual = createCommaSeparatedString(iterator); assertEquals(actual.toString(), expected); } private static String createCommaSeparatedString(Iterator iterator) { StringBuffer actual = new StringBuffer(1024); while (iterator.hasNext()) { actual.append(iterator.next()).append(','); } return actual.toString(); } @DataProvider(name = "emptyTreeIterators") public Object[][] createEmptyTreeIterators() { BinaryTree<String> tree = new BinaryTree<String>(); return new Object[][]{ {new BreadthFirstIterator<String>(tree)}, {new DepthFirstIterator<String>(tree)}, {new InOrderIterator<String>(tree)}, {new PostOrderIterator<String>(tree)}, }; } @Test(expectedExceptions = NoSuchElementException.class, dataProvider = "emptyTreeIterators") public void testNextEmptyTree(AbstractBinaryTreeIterator<String> iterator) { iterator.next(); } public void testNext() { String[] data = {"F", "B", "A", "D", "C", "E", "G", "I", "H",}; BinaryTree<String> tree = new BinaryTree<String>(); tree.insert(data); Map<String, String> expected = new HashMap<String, String>(); expected.put("depth-first", "F,B,A,D,C,E,G,I,H,"); expected.put("in-order", "A,B,C,D,E,F,G,H,I,"); expected.put("post-order", "A,C,E,D,B,H,I,G,F,"); expected.put("breadth-first", "F,B,G,A,D,I,C,E,H,"); String name = "depth-first"; AbstractBinaryTreeIterator<String> iterator = new DepthFirstIterator<String>(tree); AbstractBinaryTreeIterator.LOGGER.debug(name); assertEquals(name, expected.get(name), createCommaSeparatedString(iterator)); name = "in-order"; iterator = new InOrderIterator<String>(tree); AbstractBinaryTreeIterator.LOGGER.debug(name); assertEquals(name, expected.get(name), createCommaSeparatedString(iterator)); name = "post-order"; iterator = new PostOrderIterator<String>(tree); AbstractBinaryTreeIterator.LOGGER.debug(name); assertEquals(name, expected.get(name), createCommaSeparatedString(iterator)); name = "breadth-first"; iterator = new BreadthFirstIterator<String>(tree); AbstractBinaryTreeIterator.LOGGER.debug(name); assertEquals(name, expected.get(name), createCommaSeparatedString(iterator)); } }
digraph simple_hierarchy { F->B [label="L"] F->G [label="R"] B->A [label="L"] B->D [label="R"] D->C [label="L"] D->E [label="R"] G->I [label="R"] I->H [label="L"] }
package tree; public class Node<T extends Comparable<T>> implements Comparable { private T value; private Node<T> left; private Node<T> right; public Node(T value) { this(value, null, null); } public Node(T value, Node<T> left, Node<T> right) { this.setValue(value); this.left = left; this.right = right; } public T getValue() { return value; } public void setValue(T value) { if (value == null) throw new IllegalArgumentException("node value cannot be null"); this.value = value; } public Node<T> getLeft() { return left; } public void setLeft(Node<T> left) { this.left = left; } public Node<T> getRight() { return right; } public void setRight(Node<T> right) { this.right = right; } public boolean isLeaf() { return ((this.left == null) && (this.right == null)); } public int compareTo(Object o) { Node<T> other = (Node<T>) o; return this.getValue().compareTo(other.getValue()); } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Node node = (Node) o; if (!value.equals(node.value)) { return false; } return true; } @Override public int hashCode() { return value.hashCode(); } @Override public String toString() { return value.toString(); } }
package tree; import static org.testng.Assert.*; import org.testng.annotations.Test; @Test public class NodeTest { /** * For any non-null reference value x, x.equals(null) * must return false. */ public void testNotNull() { Node<String> x = new Node<String>("test"); assertFalse(x.equals(null)); } /** * It is reflexive: For any reference value x, * x.equals(x) must return true. */ public void testReflexive() { Node<String> x = new Node<String>("test"); assertTrue(x.equals(x)); assertEquals(0, x.compareTo(x)); } /** * It is symmetric: For any reference values x and y, * x.equals(y) must return * true if and only if y.equals(x) returns true. */ public void testSymmetric() { Node<String> x = new Node<String>("test"); Node<String> y = new Node<String>("test"); Node<String> z = new Node<String>("something else"); assertTrue(x.equals(y) && y.equals(x)); assertTrue((x.compareTo(y) == 0) && (y.compareTo(x) == 0)); assertFalse(x.equals(z)); assertTrue(x.compareTo(z) > 0); } /** * It is transitive: For any reference values x, y, * and z, if x.equals(y) returns * true and y.equals(z) returns true, * then x.equals(z) must return true */ public void testTransitive() { Node<String> x = new Node<String>("test"); Node<String> y = new Node<String>("test"); Node<String> z = new Node<String>("test"); assertTrue(x.equals(y) && y.equals(z) && z.equals(x)); assertTrue((x.compareTo(y) == 0) && (y.compareTo(z) == 0) && (z.compareTo(x) == 0)); } public void testHashCode() { Node<String> x = new Node<String>("test"); Node<String> y = new Node<String>("test"); Node<String> z = new Node<String>("something else"); assertTrue(x.hashCode() == y.hashCode()); assertFalse(x.hashCode() == z.hashCode()); } public void testToString() { String expected = "expected"; Node<String> node = new Node<String>(expected); assertEquals(node.toString(), expected); } @Test(expectedExceptions = NullPointerException.class) public void testCompareToNull() { Node<String> x = new Node<String>("test"); x.compareTo(null); } public void testCompareTo() { Node<String> x = new Node<String>("x"); Node<String> y = new Node<String>("y"); Node<String> z = new Node<String>("z"); assertTrue((x.compareTo(x) == 0) && (x.compareTo(y) < 0) && (x.compareTo(z) < 0)); assertTrue((y.compareTo(x) > 0) && (y.compareTo(y) == 0) && (y.compareTo(z) < 0)); assertTrue((z.compareTo(x) > 0) && (z.compareTo(y) > 0) && (z.compareTo(z) == 0)); } @Test(expectedExceptions = IllegalArgumentException.class) public void testNullValue() { Node<String> x = new Node<String>(null); } public void testIsLeaf() { Node<String> x = new Node<String>("test"); assertTrue(x.isLeaf()); x.setLeft(new Node<String>("left")); x.setRight(new Node<String>("right")); assertFalse(x.isLeaf()); assertEquals("left", x.getLeft().getValue()); assertEquals("right", x.getRight().getValue()); } }
package tree; import java.util.Arrays; import java.util.List; public class BinaryTree<T extends Comparable<T>> { private Node<T> root; public BinaryTree() { this(null); } public BinaryTree(Node<T> root) { this.root = root; } public Node<T> getRoot() { return this.root; } public boolean contains(T value) { return contains(this.root, value); } private boolean contains(Node<T> node, T value) { // empty tree can't contain the value; value // cannot be null if ((node == null) || (value == null)) { return false; } if (value.equals(node.getValue())) { return true; } else if (value.compareTo(node.getValue()) < 0) { return contains(node.getLeft(), value); } else { return contains(node.getRight(), value); } } public void insert(T value) { this.root = insert(this.root, value); } public void insert(List<T> values) { if ((values != null) && (values.size() > 0)) { for (T value : values) { insert(value); } } } public void insert(T [] values) { if ((values != null) && (values.length > 0)) { insert(Arrays.asList(values)); } } private Node<T> insert(Node<T> node, T value) { if (node == null) { return new Node<T>(value); } else { if (value.compareTo(node.getValue()) < 0) { node.setLeft(insert(node.getLeft(), value)); } else { node.setRight(insert(node.getRight(), value)); } } return node; } public int size() { return size(root); } private int size(Node<T> node) { if (node == null) { return 0; } else { return (size(node.getLeft()) + 1 + size(node.getRight())); } } public int height() { return height(root); } private int height(Node<T> node) { if (node == null) { return 0; } else { int leftHeight = height(node.getLeft()); int rightHeight = height(node.getRight()); return (Math.max(leftHeight, rightHeight) + 1); } } public boolean isEmpty() { return (root == null); } }
package tree; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.AssertJUnit.assertEquals; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import java.util.Arrays; import java.util.List; @Test public class BinaryTreeTest { private BinaryTree<Integer> tree; private Integer [] data = { 5, 3, 9, 1, 4, 6, }; @BeforeTest public void setUp() { tree = new BinaryTree<Integer>(); tree.insert(data); } public void testIsEmpty() { assertFalse(tree.isEmpty()); assertTrue(new BinaryTree<Integer>().isEmpty()); } public void testSize() { assertEquals(tree.size(), data.length); } public void testHeight() { int expected = 3; assertEquals(tree.height(), expected); } public void testGetRoot() { Node<Integer> expected = new Node<Integer>(data[0]); assertEquals(tree.getRoot(), expected); } public void testContains() { for (int value : data) { assertTrue(tree.contains(value)); assertFalse(tree.contains(value*1000)); } } public void testInsertList() { // When you insert a list, you get it back without // alteration using a pre-order, depth-first traversal. List<String> data = Arrays.asList("F","B","A","D","C","E","G","I","H"); BinaryTree<String> tree = new BinaryTree<String>(); tree.insert(data); // Check the size assertEquals(tree.size(), data.size()); // Now check the values BinaryTreeIterator<String> iterator = new DepthFirstIterator<String>(tree); int i = 0; while (iterator.hasNext()) { assertEquals("i = " + i, iterator.next(), data.get(i++)); } } public void testInsertArray() { // When you insert a list, you get it back without // alteration using a pre-order, depth-first traversal. String [] data = {"F","B","A","D","C","E","G","I","H",}; BinaryTree<String> tree = new BinaryTree<String>(); tree.insert(data); assertEquals(tree.size(), data.length); BinaryTreeIterator<String> iterator = new DepthFirstIterator<String>(tree); int i = 0; while (iterator.hasNext()) { assertEquals("i = " + i, iterator.next(), data[i++]); } } public void testInsertNullList() { List<String> data = null; BinaryTree<String> tree = new BinaryTree<String>(); tree.insert(data); assertEquals(tree.size(), 0); } public void testInsertNullArray() { String [] data = null; BinaryTree<String> tree = new BinaryTree<String>(); tree.insert(data); assertEquals(tree.size(), 0); } }
The fiscal condition of the United Sates has deteriorated dramatically during the last several years. On the basis of current obligations, U.S. indebtedness totals “only” about $12 trillion. But when utilizing traditional GAAP accounting – the kind of accounting that every public company in the United States MUST use – U.S. indebtedness soars to $74 trillion. This astounding sum is more than six times U.S. GDP. (GAAP accounting includes things like the present value of the Social Security liability and the Medicare liability – i.e. real liabilities.)