BinarySearchTree中的余额方法有什么问题? (Java)

时间:2019-04-30 00:43:14

标签: java arrays recursion binary-search-tree nodes

我创建了一个方法来平衡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的参数内分配了不正确的值。

0 个答案:

没有答案