The challenge
You are given a binary tree. Implement the method findMax
which returns the maximal node value in the tree.
For example, the maximum in the following Tree is 11.
7
/ \
/ \
5 2
\ \
6 11
/\ /
1 9 4
Note:
- Tree node values range is Integer MIN VALUE – Integer MAX VALUE constants.
- Tree can unbalanced and unsorted.
- Root node is always not null.
You are given a tree node class as follows:
class TreeNode {
TreeNode left;
TreeNode right;
int value;
}
The solution in Java code
Option 1:
public class FindMaxValueInTree {
static int findMax(TreeNode root) {
int numMax = root.value;
if(root.left != null) {
numMax = Math.max(numMax, findMax(root.left));
}
if(root.right != null) {
numMax = Math.max(numMax, findMax(root.right));
}
return numMax;
}
}
Option 2:
public class FindMaxValueInTree {
static int findMax(TreeNode root) {
return
Math.max(
root.left != null ? Math.max(root.value, findMax(root.left)) : root.value,
root.right != null ? Math.max(root.value, findMax(root.right)) : root.value
);
}
}
Option 3:
import java.util.LinkedList;
import java.util.Queue;
public class FindMaxValueInTree {
static int findMax(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
int max = Integer.MIN_VALUE;
queue.add(root);
while (!queue.isEmpty()) {
TreeNode treenode = queue.poll();
if (treenode.value > max) max = treenode.value;
if (treenode.left != null) queue.add(treenode.left);
if (treenode.right != null) queue.add(treenode.right);
}
return max;
}
}
Test cases to validate our solution
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
public class FindMaxValueInTreeTest {
@Test
public void findMaxInLeaf() {
TreeNode root = TreeNode.leaf(-1);
assertThat(FindMaxValueInTree.findMax(root), is(-1));
}
@Test
public void findMaxInOneChildTree() {
TreeNode root = TreeNode.leaf(1).withLeftLeaf(2);
assertThat(FindMaxValueInTree.findMax(root), is(2));
}
@Test
public void findMaxInPerfectTree() {
TreeNode left = TreeNode.leaf(-22).withLeaves(9, 50);
TreeNode right = TreeNode.leaf(11).withLeaves(9, 2);
TreeNode root = TreeNode.join(5, left, right);
assertThat(FindMaxValueInTree.findMax(root), is(50));
}
@Test
public void findMaxInUnbalancedTree() {
TreeNode left = TreeNode.leaf(50).withLeaves(-100, -10);
TreeNode right = TreeNode.leaf(40);
TreeNode root = TreeNode.join(6, left, right);
assertThat(FindMaxValueInTree.findMax(root), is(50));
}
@Test
public void findMaxInNegativeTree() {
TreeNode left = TreeNode.leaf(-50).withLeaves(-100, -10);
TreeNode right = TreeNode.leaf(-40);
TreeNode root = TreeNode.join(-600, left, right);
assertThat(FindMaxValueInTree.findMax(root), is(-10));
}
}