我正在尝试使用二叉搜索树的功能,而无需实际创建 Node 对象并赋予它们左/右子对象,而是在三个并行数组中使用二叉搜索树的基本思想:左、数据和右。在这些数组中的特定索引处,left 保存当前数据的左孩子所在的数据的索引,而 right 保存当前数据的右孩子所在的数据的索引。这张表提供了一个更好的例子来说明我在说什么:
-1 值表示节点没有左或右子节点的位置。在插入任何节点之前,所有数组的值都为0,每次插入一个节点时,它的左右子索引值都设置为-1(表示我们刚刚插入的是叶子)。我正在努力弄清楚的是如何在不意外访问-1索引的情况下递归地执行此操作。我在下面看到的当前尝试遇到了这个问题:
public void insert(int d) {
//PRE: the tree is not full
//if d is not in the tree insert d otherwise the tree does not change
if(root == -1) {
root = d;
}
insert(d, 0);
}
private void insert(int d, int index) {
if(data[index] == d) {
return;
}
if(data[index] == 0) {
data[index] = d;
right[index] = -1;
left[index] = -1;
}
if(data[index] > d) {
if(left[index] == 0) {
data[index] = d;
right[index] = -1;
left[index] = -1;
} else {
insert(d, left[index]);
}
}
if(data[index] < d) {
if(right[index] == 0) {
data[index] = d;
right[index] = -1;
left[index] = -1;
} else {
insert(d, right[index]);
}
}
return;
}
我很好奇如何防止访问索引值为 -1 的数组,同时仍然能够指示节点在特定一侧没有子节点。
我理解这样的概念,每次我插入一个节点时,我都在插入一个叶子,所以当一个节点被放置在特定的索引处时,它的左右可以自动设置为-1,但是我当前的递归调用结束在某一点或另一点传入-1。即使我将此值更改为 0 或其他值,也不一定能帮助我在递归中取得任何进展。