Java BinarySearchTree和变量中的递归

时间:2018-02-11 11:21:40

标签: java recursion

我在理解以下内容时遇到了问题:

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>如果没有人有价值,那么就完成了吗?他们都是零或者其他什么,那么他怎么能比较呢?谢谢!

2 个答案:

答案 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。你能看到顺序如何按顺序完成吗?