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