【发布时间】:2013-12-18 22:27:45
【问题描述】:
好的,我正在尝试平衡二叉搜索树,我知道它为什么不起作用,但我不知道如何修复它。这就是我的平衡方法。
public void balance(){
if(isEmpty()){
System.out.println("Empty Tree");
return;
}
if(!isEmpty()){
values = new Object[count()];
index = 0;
createAscendingArray(root);
clear();
balanceRecursive(0, index);
values = null;
}
}
private void createAscendingArray(TreeNode<E> current){
if(current == null)
return;
if(current.getLeftNode() != null)
createAscendingArray(current.getLeftNode());
else if(current.getRightNode() != null)
createAscendingArray(current.getRightNode());
values[index] = current.getData();
index++;
}
private void balanceRecursive(int low, int high){
if(low == high)
return;
else if(low > high/2)
balanceRecursive(high/2, high);
else if(low < high/2)
balanceRecursive(low, high/2);
E insert = (E) values[(low + high)/2];
insertItem(insert);
}
为了更清楚一点,index 是一个预定义的私有 int 变量,values 也是一个预定义的 Object[]。根是我的不平衡树开始处的节点。首先,我知道我的数组以相反的顺序添加值。现在我只是在将 1、2、3、4、5、6 添加到树中进行测试,所以我的数组出现了 654321。我不确定我需要如何将添加的值添加到我的数组,以便它以正确的升序而不是降序添加它们。
现在,当我查看我的代码时,我知道 balanceRecursive() 方法永远无法用于实现数组的上半部分。我的问题是我不知道如何写它,所以它会。我的任务是用我不太熟悉的递归来做到这一点。我可以通过迭代来做到这一点,但它是严格定义的,我必须使用递归。
Balance 应该是这样工作的: balance() 算法
- 检查树是否为空
o 如果是,则打印“空树”
o 返回
- 如果树不是空的
o 创建树大小的对象数组
o 将索引设置为 0
o 使用 ASCENDING 顺序的所有值填充数组 (createAscendingArray())
o 清除树
o 从对象数组重新填充树 (balanceRecursive())
o 将值数组设置为空
(我已经为 count() 编写了方法来计算树中的节点数和 clear() 来清空树)
balanceRecursive() 应该执行以下操作 使用 values 数据成员中的值重新填充 Tree。这些必须以适当的顺序添加以创建平衡树。
添加中间元素
这会创建两个子数组,一个左和一个右
添加那些子数组的中间
这会创建更多的子数组
继续添加子数组的中间直到没有
我知道对于这种方法,我从不使用更大的子数组集,这是我无法弄清楚如何实现的递归部分。有关如何清理我的递归的任何建议?
编辑:
我将 createAscendingArray() 更改为以下内容:
private void createAscendingArray(TreeNode<E> current){
if(current == null)
return;
createAscendingArray(current.getLeftNode());
values[index] = current.getData();
index++;
createAscendingArray(current.getRightNode());
}
这应该类似于 BST 的 inOrder 遍历,对吗?
【问题讨论】:
标签: java arrays algorithm recursion binary-search-tree