Convert a sorted linkedlist into a balanced binary search tree. Looking for code-review, optimizations, and best practices.
public class SortedLinkedListToBalancedBST<T> {
private TreeNode<T> root;
private static class TreeNode<T> {
TreeNode<T> left;
T item;
TreeNode<T> right;
};
public void convert(LinkedList<T> ll) {
Iterator<T> itr = ll.iterator();
root = inorder(0, ll.size() - 1, itr);
}
private TreeNode<T> inorder(int lb, int hb, Iterator<T> itr) {
if (lb > hb) return null;
// same as (lb+hb)/2, avoids overflow
int mid = lb + (hb - lb) / 2;
final TreeNode<T> treeNode = new TreeNode<T>();
treeNode.left = inorder(lb, mid - 1, itr);
treeNode.item = itr.next();
treeNode.right = inorder(mid + 1, hb, itr);
return treeNode;
}
public List<T> getInorderList() {
final List<T> inorderList = new ArrayList<T>();
inorder(root, inorderList);
return inorderList;
}
private void inorder(TreeNode<T> node, List<T> list) {
if (node != null) {
inorder(node.left, list);
list.add(node.item);
inorder(node.right, list);
}
}
}
public class SortedLinkedListToBalancedBSTTest {
@Test
public void testOne() {
SortedLinkedListToBalancedBST<Integer> s = new SortedLinkedListToBalancedBST<Integer>();
LinkedList<Integer> list1 = new LinkedList<Integer>(Arrays.asList(1, 2, 3, 4));
s.convert(list1);
assertEquals(list1, s.getInorderList());
}
@Test
public void testTwo() {
SortedLinkedListToBalancedBST<Integer> s = new SortedLinkedListToBalancedBST<Integer>();
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
s.convert(list2);
assertEquals(list2, s.getInorderList());
}
@Test
public void testThree() {
SortedLinkedListToBalancedBST<Integer> s = new SortedLinkedListToBalancedBST<Integer>();
LinkedList<Integer> list3 = new LinkedList<Integer>(Arrays.asList(1, 2, 3, 4, 5, 6));
s.convert(list3);
assertEquals(list3, s.getInorderList());
}
@Test
public void testFour() {
SortedLinkedListToBalancedBST<Integer> s = new SortedLinkedListToBalancedBST<Integer>();
LinkedList<Integer> list4 = new LinkedList<Integer>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
s.convert(list4);
assertEquals(list4, s.getInorderList());
}
}