我创建了一个方法来平衡BinarySearchTree。
说明是,balance方法应更新树以使其平衡,这意味着子树高度之间的最大差异不超过1。
通过以下过程:
•在树中获取一个排序值数组(我们有一个方法可以做到这一点)
•将树的根分配给buildTreeUtil helper方法的结果(如下所述)
•调用assignFirst更新树的“ first”属性
buildTreeUtil(E [],int,int,BSTNode父级)帮助器方法使用值的排序列表重建树。由于它具有此排序列表,因此不必搜索要在何处插入新值,因此它不会(也不应该)调用add方法。而是在添加新节点时从值的排序列表中有选择地获取值。其算法如下:
•如果“开始”参数大于“结束”参数,则应停止递归
•创建一个新节点,将中间元素存储在列表中
•使用列表的左半部分将新节点的左引用分配给递归调用
•使用列表的右半部分将新节点的正确引用分配给递归调用
这是以下代码:
public void balance()
{
this.root = buildTreeUtil(toArray(), 0, size(), first);
assignFirst();
}
private BSTNode<E> buildTreeUtil(E[] values, int start, int end, BSTNode<E> parent)
{
if(start > end)
{
return null;
}
int mid = (start + end)/2;
BSTNode<E> node = new BSTNode<E>(values[mid]);
node.left = buildTreeUtil(values, start, mid - 1, parent.left);
node.right = buildTreeUtil(values, mid + 1, end, parent.right);
return node;
}
private void assignFirst()
{
if (root.left != null)
{
first.left = first;
}
else
{
first = root;
}
}
@SuppressWarnings("unchecked")
public E[] toArray()
{
ArrayList<E> aList = new ArrayList<E>();
E[] arr = (E[]) new Comparable[this.numElements];
toArray(this.root, aList);
return aList.toArray(arr);
}
private void toArray(BSTNode<E> node, List<E> aList)
{
if (node != null)
{
toArray(node.left, aList);
aList.add(node.data);
toArray(node.right, aList);
}
}
这只是我代码的其余部分,因此有一些有价值的背景信息。
public class BinarySearchTree<E extends Comparable<E>>
{
private BSTNode<E> root; // root of overall tree
private int numElements;
private BSTNode<E> first;
// post: constructs an empty search tree
public BinarySearchTree()
{
this.root = null;
this.numElements = 0;
}
public class Iterator
{
private BSTNode<E> currentNode;
public Iterator()
{
currentNode = first;
}
public boolean hasNext()
{
return currentNode != null;
}
public E next()
{
E value = currentNode.data;
currentNode = currentNode.next;
return value;
}
}
private static class BSTNode<E>
{
public E data;
public BSTNode<E> left;
public BSTNode<E> right;
public BSTNode<E> parent;
public BSTNode<E> next;
public BSTNode(E data)
{
this(data, null, null, null, null);
}
public BSTNode(E data, BSTNode<E> left, BSTNode<E> right, BSTNode<E> parent, BSTNode<E> next)
{
this.data = data;
this.left = left;
this.right = right;
this.parent = parent;
this.next = next;
}
}
}
我不确定错误发生在哪里,或者我是否在buildTreeUtil的参数内分配了不正确的值。