我在理解以下内容时遇到了问题:
public int sort(char[] arr, int index)
{
if(!isEmpty())
{
index = leftChild.sort(arr,index);
arr[index++] = getContent().getToken();
index = rightChild.sort(arr,index);
}
return index;
}
为什么这样做但不是这样:
public void sort(char[] arr, int index)
{
if(!isEmpty())
{
leftChild.sort(arr,index);
arr[index++] = getContent().getToken();
rightChild.sort(arr,index);
}
}
我也不明白这一点:index = leftChild.sort(arr,index);这是做什么的?你们能不能给我举个例子? 谢谢你的帮助,
Kiimarii
还有一个问题,我有一个方法可以打印从binaryTree到leafTree叶子的最长路径:
public int height()
{
if ( !isEmpty() )
{
int leftHeight = leftChild.height();
int rightHeight = rightChild.height();
if ( leftHeight > rightHeight )
{
return leftHeight + 1;
} else {
return rightHeight + 1;
}
} else {
return 0;
}
}
但是怎么可以leftHeight>如果没有人有价值,那么就完成了吗?他们都是零或者其他什么,那么他怎么能比较呢?谢谢!
答案 0 :(得分:1)
您的方法执行二进制搜索树的有序遍历。
第一个代码片段首先调用leftChild.sort(arr,index)
,它将左子树分配给输入数组。它返回要分配的下一个索引。
然后您将当前节点的getContent().getToken()
分配给arr[index]
然后对rightChild.sort(arr,index)
的调用将正确的子树分配给输入数组,并返回下一个要分配的index
。
如果忽略递归调用返回的index
(就像在第二个代码段中那样),arr[index++] = getContent().getToken();
将始终为数组的0
索引赋值(假设初始调用是(sort(arr,0))
)。
您必须将返回的索引分配给本地index
变量,以便将getContent().getToken()
分配给数组的正确index
。
答案 1 :(得分:0)
关键是index
是一个局部变量。让我们按照一个非常简单的例子:
4
/ \
2 6
/
1
// First call
(4).sort(arr, 0);
// The left child of (4) is (2)
// (Note that each 'index' here
// is a local variable.)
index = (2).sort(arr, 0);
// We've just called sort again
index = (1).sort(arr, 0)
// and again
index = (empty).sort(array, 0)
// isEmpty() is true
// so return index
return 0
<=
index = 0
// assign contents of (1) to
// arr[0] and increment 0
arr[index++] = getContent().getToken();
// Process right child of (1)
// (index returns unchanged)
index = (empty).sort(arr, 1);
return 1
<=
index = 1
...
我们现在正在调用(2).sort
,因此将其内容分配给数组的索引1。你能看到顺序如何按顺序完成吗?