【问题标题】:Why do I need a helper method to recursively search a binary search tree?为什么我需要一个辅助方法来递归搜索二叉搜索树?
【发布时间】:2015-10-09 01:14:51
【问题描述】:

下面是二叉搜索树的实现代码:

public class BST<T extends Comparable<T>> {

BSTNode<T> root;




public T search(T target)
{
    //loop to go through nodes and determine which routes to make
    BSTNode<T> tmp = root;
    while(tmp != null)
    {
        //c can have 3 values
        //0 = target found
        //(negative) = go left, target is smaller
        //(positive) = go left, target is greater than current position
        int c = target.compareTo(tmp.data);

        if(c==0)
        {
            return tmp.data;
        }
        else if(c<0)
        {
            tmp = tmp.left;
        }
        else
        {
            tmp = tmp.right;
        }

    }
    return null;
}

/*
 * Need a helper method
 */
public T recSearch(T target)
{
    return recSearch(target, root);

}

//helper method for recSearch()
private T recSearch(T target, BSTNode<T> root)
{
    //Base case
    if(root == null)
        return null;

    int c = target.compareTo(root.data);

    if(c == 0)
        return root.data;
    else if(c<0)
        return recSearch(target, root.left);
    else
        return recSearch(target, root.right);
}

为什么我需要递归辅助方法?为什么我不能只使用“this.root”来执行正在发生的递归过程?此外,如果搞砸正在调用此方法的对象的根属性是一个问题,那么辅助方法如何防止这种情况发生?它是否只是创建了一个与 this.root 属性分开的指针,因此不会弄乱正在调用该方法的对象的根属性?

对不起,如果这个问题看起来不直截了当,但如果有人能告诉我幕后究竟发生了什么,我将不胜感激。

【问题讨论】:

  • 最好询问原始开发人员,但是.. 假设 root 是(应该)私有的,另一段代码如何调用 new BST().recSearch(target, root)this.root 是从哪里获得的,因为它是私人成员?

标签: java recursion binary-search-tree helpermethods


【解决方案1】:

该方法需要一个起点。它需要有一个不变的目标节点,并且需要将它与其他一些节点进行比较以查看它们是否匹配让我们将此节点称为current 而不是root,因为它是递归方法正在评估的当前节点。当使用递归方法时,除了使用辅助函数并传入两个变量(许多递归方法就是这种情况)之外,确实没有一种简洁的方法可以做到这一点。正如你所说,如果你更新了根目录,你会在向左或向右移动时完全改变你的树,这是你不想做的。使用辅助函数是因为它为您的递归方法提供了一个起点。它还跟踪您正在处理的current 节点,因为您说该方法指向正在评估的 Node 对象,但不进行任何更改。当向左或向右移动时,它不会修改任何内容,它只是传递对左侧或右侧节点的引用并继续执行此操作,直到找到目标或命中基本情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 2014-01-02
    • 1970-01-01
    • 2013-04-14
    • 2021-07-03
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多