Implement max and secondMax

This commit is contained in:
2021-09-03 11:52:57 +02:00
parent f370e69dd1
commit 4e98be1c07
2 changed files with 77 additions and 10 deletions

View File

@ -49,13 +49,45 @@ public class RecursiveOrderedBinaryTreeNodeProcessor<V> extends OrderedBinaryTre
} }
@Override @Override
public V max(BinaryTreeNode<V> tree, Comparator<V> cmp) { public V max(BinaryTreeNode<V> tree) {
return null; if (tree == null) {
throw new IllegalArgumentException("An empty tree has no max");
}
if (tree.right == null) {
return tree.key;
}
return max(tree.right);
} }
@Override @Override
public V secondMax(BinaryTreeNode<V> tree, Comparator<V> cmp) { public V secondMax(BinaryTreeNode<V> tree) {
return null; if (tree == null) {
throw new IllegalArgumentException("An empty tree has no second max");
}
if (tree.right != null) {
return secondMaxRec(tree.right, tree.key);
}
if (tree.left != null) {
return max(tree.left);
}
throw new IllegalArgumentException("A tree with only one element has no second max");
}
private V secondMaxRec(BinaryTreeNode<V> node, V prev) {
if (node.right != null) {
return secondMaxRec(node.right, node.key);
}
if (node.left != null) {
return max(node.left);
}
return prev;
} }
@Override @Override

View File

@ -1,7 +1,7 @@
package aud.exam.prep.tree; package aud.exam.prep.tree;
import aud.exam.prep.ListProvider; import aud.exam.prep.ListProvider;
import aud.exam.prep.tree.OrderedTreeProcessor; import aud.exam.prep.Tests;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource; import org.junit.jupiter.params.provider.ArgumentsSource;
@ -42,14 +42,49 @@ public abstract class OrderedTreeProcessorTest<T> {
@ParameterizedTest @ParameterizedTest
@ArgumentsSource(ListProvider.class) @ArgumentsSource(ListProvider.class)
void testThat_insertAndIterateWork(List<Integer> list) { void testThat_insertAndIterateWork(List<Integer> list) {
T t = processor.newEmptyTree(); T t = asTree(list);
for (var n : list) {
t = processor.insert(t, n, CMP);
}
list.sort(CMP); list.sort(CMP);
assertTrue(processor.check(t, CMP)); assertTrue(processor.check(t, CMP));
assertIterableEquals(list, processor.iterate(t)); assertIterableEquals(list, processor.iterate(t));
} }
private T asTree(List<Integer> list) {
T t = processor.newEmptyTree();
for (var n : list) {
t = processor.insert(t, n, CMP);
}
return t;
}
@ParameterizedTest
@ArgumentsSource(ListProvider.class)
void testThat_maxWorks(List<Integer> list) {
list.add(-1);
T t = asTree(list);
Integer max = Tests.getMax(list);
assertEquals(max, processor.max(t));
}
@ParameterizedTest
@ArgumentsSource(ListProvider.class)
void testThat_secondMaxWorks(List<Integer> list) {
list.add(-1);
list.add(-2);
T t = asTree(list);
Integer max = Tests.getSecondMax(list);
assertEquals(max, processor.secondMax(t));
}
@ParameterizedTest
@ArgumentsSource(ListProvider.class)
void printATree(List<Integer> list) {
T t = asTree(list);
processor.print(t);
}
} }