Partly implement RecursiveOrderedBinaryTreeNodeProcessor
This commit is contained in:
		
							parent
							
								
									5661e3dbd2
								
							
						
					
					
						commit
						268361484d
					
				
					 8 changed files with 501 additions and 0 deletions
				
			
		
							
								
								
									
										57
									
								
								src/aud/exam/prep/tree/BinaryTreeIterator.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/aud/exam/prep/tree/BinaryTreeIterator.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import java.util.Iterator; | ||||||
|  | import java.util.NoSuchElementException; | ||||||
|  | 
 | ||||||
|  | class BinaryTreeIterator<T> implements Iterator<T> { | ||||||
|  | 
 | ||||||
|  |     private final Stack<StackFrame> stack = new Stack<>(); | ||||||
|  | 
 | ||||||
|  |     BinaryTreeIterator(BinaryTreeNode<T> node) { | ||||||
|  |         if (node != null) { | ||||||
|  |             var frame = new StackFrame(); | ||||||
|  |             frame.node = node; | ||||||
|  |             stack.push(frame); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean hasNext() { | ||||||
|  |         return !stack.empty(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public T next() { | ||||||
|  |         if (!hasNext()) { | ||||||
|  |             throw new NoSuchElementException(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         var frame = stack.peek(); | ||||||
|  | 
 | ||||||
|  |         while (!frame.pushedLeft) { | ||||||
|  |             frame.pushedLeft = true; | ||||||
|  | 
 | ||||||
|  |             if (frame.node.left != null) { | ||||||
|  |                 var newFrame = new StackFrame(); | ||||||
|  |                 newFrame.node = frame.node.left; | ||||||
|  |                 stack.push(newFrame); | ||||||
|  |                 frame = newFrame; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         stack.pop(); | ||||||
|  | 
 | ||||||
|  |         if (frame.node.right != null) { | ||||||
|  |             var newFrame = new StackFrame(); | ||||||
|  |             newFrame.node = frame.node.right; | ||||||
|  |             stack.push(newFrame); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return frame.node.key; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private class StackFrame { | ||||||
|  |         boolean pushedLeft = false; | ||||||
|  |         BinaryTreeNode<T> node; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								src/aud/exam/prep/tree/OrderedBinaryTreeNodeProcessor.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/aud/exam/prep/tree/OrderedBinaryTreeNodeProcessor.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | abstract class OrderedBinaryTreeNodeProcessor<V> implements OrderedTreeProcessor<V, BinaryTreeNode<V>> { | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> newEmptyTree() { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Iterable<V> iterate(BinaryTreeNode<V> tree) { | ||||||
|  |         return () -> | ||||||
|  |                 new BinaryTreeIterator<>(tree); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void print(BinaryTreeNode<V> tree) { | ||||||
|  |         printRec(tree, 0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void printRec(BinaryTreeNode<V> tree, int indent) { | ||||||
|  |         if (tree == null) { | ||||||
|  |             System.out.println("- *"); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         System.out.println("-> " + tree.key); | ||||||
|  | 
 | ||||||
|  |         System.out.print(" |".repeat(indent)); | ||||||
|  |         System.out.print(" L"); | ||||||
|  |         printRec(tree.left, indent + 1); | ||||||
|  | 
 | ||||||
|  |         System.out.print(" |".repeat(indent)); | ||||||
|  |         System.out.print(" L"); | ||||||
|  |         printRec(tree.right, indent + 1); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										82
									
								
								src/aud/exam/prep/tree/OrderedTreeProcessor.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/aud/exam/prep/tree/OrderedTreeProcessor.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,82 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import java.util.Comparator; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Instances of this interface can work with any "valid" tree of type <code>T</code>. | ||||||
|  |  * For what is valid, see {@link #check(T, Comparator)}. | ||||||
|  |  * For this processor trees always have to be "in order". | ||||||
|  |  * This is a literal translation of the "inspiration sheet" into java. | ||||||
|  |  * | ||||||
|  |  * @param <V> Type of elements stored in <code>T</code> | ||||||
|  |  * @param <T> Type of the tree | ||||||
|  |  */ | ||||||
|  | public interface OrderedTreeProcessor<V, T> { | ||||||
|  | 
 | ||||||
|  |     boolean find(T t, V v, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     boolean override(T t, V from, V to, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     boolean overrideAll(T t, V from, V to, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     T insert(T t, V v, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     boolean remove(T t, V v, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     boolean removeAll(T t, V v, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     V max(T t, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     V secondMax(T t, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     int height(T t); | ||||||
|  | 
 | ||||||
|  |     boolean isBalanced(T t); | ||||||
|  | 
 | ||||||
|  |     int numberOfNodes(T t); | ||||||
|  | 
 | ||||||
|  |     int numberOfNodesOnLevel(T t, int level); | ||||||
|  | 
 | ||||||
|  |     T rightmostNodeInLeftSubtree(T t); | ||||||
|  | 
 | ||||||
|  |     T leftmostNodeInRightSubtree(T t); | ||||||
|  | 
 | ||||||
|  |     T invert(T t); | ||||||
|  | 
 | ||||||
|  |     T clone(T t); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check whether ot not the given tree is "valid" according to | ||||||
|  |      * what is considered valid depends on the specific data structure. | ||||||
|  |      * This is also used by the tests to verify implementations. | ||||||
|  |      * This has to be tested separate for each data structure. | ||||||
|  |      * | ||||||
|  |      * @param t A tree | ||||||
|  |      * @return true iff the given tree is valid | ||||||
|  |      */ | ||||||
|  |     boolean check(T t, Comparator<V> cmp); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Create an empty tree. | ||||||
|  |      * | ||||||
|  |      * @return A new, empty tree | ||||||
|  |      */ | ||||||
|  |     T newEmptyTree(); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Return an {@link Iterable}, or a lambda returning {@link java.util.Iterator}, | ||||||
|  |      * over the elements of the tree <code>t</code>. | ||||||
|  |      * This is required by the tests. | ||||||
|  |      * | ||||||
|  |      * @param t A tree | ||||||
|  |      * @return An {@link Iterable} over t | ||||||
|  |      */ | ||||||
|  |     Iterable<V> iterate(T t); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Print a tree to standard out | ||||||
|  |      * | ||||||
|  |      * @param t A tree | ||||||
|  |      */ | ||||||
|  |     void print(T t); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,131 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import java.util.Comparator; | ||||||
|  | 
 | ||||||
|  | public class RecursiveOrderedBinaryTreeNodeProcessor<V> extends OrderedBinaryTreeNodeProcessor<V> { | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean find(BinaryTreeNode<V> tree, V v, Comparator<V> cmp) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean override(BinaryTreeNode<V> pointer, V from, V to, Comparator<V> cmp) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean overrideAll(BinaryTreeNode<V> pointer, V from, V to, Comparator<V> cmp) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> insert(BinaryTreeNode<V> tree, V v, Comparator<V> cmp) { | ||||||
|  |         if (tree == null) { | ||||||
|  |             tree = new BinaryTreeNode<>(); | ||||||
|  |             tree.key = v; | ||||||
|  |             return tree; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         var c = cmp.compare(v, tree.key); | ||||||
|  | 
 | ||||||
|  |         if (c <= 0) { | ||||||
|  |             tree.left = insert(tree.left, v, cmp); | ||||||
|  |         } else { | ||||||
|  |             tree.right = insert(tree.right, v, cmp); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return tree; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean remove(BinaryTreeNode<V> tree, V v, Comparator<V> cmp) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean removeAll(BinaryTreeNode<V> tree, V v, Comparator<V> cmp) { | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public V max(BinaryTreeNode<V> tree, Comparator<V> cmp) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public V secondMax(BinaryTreeNode<V> tree, Comparator<V> cmp) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int height(BinaryTreeNode<V> tree) { | ||||||
|  |         if (tree == null) { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean isBalanced(BinaryTreeNode<V> tree) { | ||||||
|  |         if (tree == null) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int numberOfNodes(BinaryTreeNode<V> tree) { | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int numberOfNodesOnLevel(BinaryTreeNode<V> tree, int level) { | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> rightmostNodeInLeftSubtree(BinaryTreeNode<V> tree) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> leftmostNodeInRightSubtree(BinaryTreeNode<V> tree) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> invert(BinaryTreeNode<V> tree) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public BinaryTreeNode<V> clone(BinaryTreeNode<V> tree) { | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public boolean check(BinaryTreeNode<V> tree, Comparator<V> cmp) { | ||||||
|  |         if (tree == null) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (tree.key == null) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (tree.left != null) { | ||||||
|  |             if (!check(tree.left, cmp) || cmp.compare(tree.left.key, tree.key) > 0) { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (tree.right != null) { | ||||||
|  |             if (!check(tree.right, cmp) || cmp.compare(tree.right.key, tree.key) < 0) { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								src/aud/exam/prep/tree/Stack.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/aud/exam/prep/tree/Stack.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import aud.exam.prep.array.Arrays; | ||||||
|  | 
 | ||||||
|  | @SuppressWarnings("ManualArrayCopy") | ||||||
|  | public class Stack<T> { | ||||||
|  | 
 | ||||||
|  |     private int size = 0; | ||||||
|  |     private T[] theStack = Arrays.newArray(10); | ||||||
|  | 
 | ||||||
|  |     public void push(T t) { | ||||||
|  |         while (size >= theStack.length) { | ||||||
|  |             T[] newStack = Arrays.newArray(theStack.length * 2); | ||||||
|  | 
 | ||||||
|  |             for (int i = 0; i < theStack.length; i++) { | ||||||
|  |                 newStack[i] = theStack[i]; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             theStack = newStack; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         theStack[size++] = t; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public T peek() { | ||||||
|  |         return theStack[size-1]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public T pop() { | ||||||
|  |         return theStack[--size]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public boolean empty() { | ||||||
|  |         return size == 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,96 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import static aud.exam.prep.Tests.CMP; | ||||||
|  | import static org.junit.jupiter.api.Assertions.*; | ||||||
|  | 
 | ||||||
|  | public abstract class OrderedBinaryTreeNodeProcessorTest extends OrderedTreeProcessorTest<BinaryTreeNode<Integer>> { | ||||||
|  | 
 | ||||||
|  |     protected OrderedBinaryTreeNodeProcessorTest(OrderedTreeProcessor<Integer, BinaryTreeNode<Integer>> processor) { | ||||||
|  |         super(processor); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfNull() { | ||||||
|  |         assertTrue(processor.check(null, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfNoChildrenIsTrue() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 2; | ||||||
|  |         assertTrue(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfNoKeyIsFalse() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         assertFalse(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfLeftGreaterIsFalse() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.left = new BinaryTreeNode<>(); | ||||||
|  |         t.left.key = 10; | ||||||
|  | 
 | ||||||
|  |         assertFalse(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfLeftSmallerIsTrue() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.left = new BinaryTreeNode<>(); | ||||||
|  |         t.left.key = 2; | ||||||
|  | 
 | ||||||
|  |         assertTrue(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfRightGreaterIsTrue() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.right = new BinaryTreeNode<>(); | ||||||
|  |         t.right.key = 10; | ||||||
|  | 
 | ||||||
|  |         assertTrue(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfRightSmallerIsFalse() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.right = new BinaryTreeNode<>(); | ||||||
|  |         t.right.key = 2; | ||||||
|  | 
 | ||||||
|  |         assertFalse(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfBadRightIsFalse() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.right = new BinaryTreeNode<>(); | ||||||
|  | 
 | ||||||
|  |         assertFalse(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_checkOfLeftIsFalse() { | ||||||
|  |         var t = new BinaryTreeNode<Integer>(); | ||||||
|  |         t.key = 5; | ||||||
|  | 
 | ||||||
|  |         t.left = new BinaryTreeNode<>(); | ||||||
|  | 
 | ||||||
|  |         assertFalse(processor.check(t, CMP)); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										55
									
								
								test/aud/exam/prep/tree/OrderedTreeProcessorTest.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								test/aud/exam/prep/tree/OrderedTreeProcessorTest.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | import aud.exam.prep.ListProvider; | ||||||
|  | import aud.exam.prep.tree.OrderedTreeProcessor; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.junit.jupiter.params.ParameterizedTest; | ||||||
|  | import org.junit.jupiter.params.provider.ArgumentsSource; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | import static aud.exam.prep.Tests.CMP; | ||||||
|  | import static org.junit.jupiter.api.Assertions.*; | ||||||
|  | 
 | ||||||
|  | public abstract class OrderedTreeProcessorTest<T> { | ||||||
|  | 
 | ||||||
|  |     protected final OrderedTreeProcessor<Integer, T> processor; | ||||||
|  | 
 | ||||||
|  |     protected OrderedTreeProcessorTest(OrderedTreeProcessor<Integer, T> processor) { | ||||||
|  |         this.processor = processor; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void testThat_newEmptyTreeWorks() { | ||||||
|  |         T t = processor.newEmptyTree(); | ||||||
|  | 
 | ||||||
|  |         assertTrue(processor.check(t, CMP)); | ||||||
|  | 
 | ||||||
|  |         assertEquals(-1, processor.height(t)); | ||||||
|  | 
 | ||||||
|  |         assertTrue(processor.isBalanced(t)); | ||||||
|  | 
 | ||||||
|  |         assertEquals(0, processor.numberOfNodes(t)); | ||||||
|  | 
 | ||||||
|  |         for (int i = 0; i < 10; i++) { | ||||||
|  |             assertEquals(0, processor.numberOfNodesOnLevel(t, i)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         assertIterableEquals(List.of(), processor.iterate(t)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     @ParameterizedTest | ||||||
|  |     @ArgumentsSource(ListProvider.class) | ||||||
|  |     void testThat_insertAndIterateWork(List<Integer> list) { | ||||||
|  |         T t = processor.newEmptyTree(); | ||||||
|  | 
 | ||||||
|  |         for (var n : list) { | ||||||
|  |             t = processor.insert(t, n, CMP); | ||||||
|  |         } | ||||||
|  |         list.sort(CMP); | ||||||
|  | 
 | ||||||
|  |         assertTrue(processor.check(t, CMP)); | ||||||
|  |         assertIterableEquals(list, processor.iterate(t)); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | package aud.exam.prep.tree; | ||||||
|  | 
 | ||||||
|  | public class RecursiveOrderedBinaryTreeNodeProcessorTest extends OrderedBinaryTreeNodeProcessorTest { | ||||||
|  | 
 | ||||||
|  |     public RecursiveOrderedBinaryTreeNodeProcessorTest() { | ||||||
|  |         super(new RecursiveOrderedBinaryTreeNodeProcessor<>()); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in a new issue