【问题标题】:Recursively counting specific nodes in a binary search tree递归计算二叉搜索树中的特定节点
【发布时间】:2014-05-10 03:01:22
【问题描述】:

我正在尝试在 Java 中创建一个方法来计算二叉搜索树中包含特定值的节点并打印出它们的内容。每个节点都包含一个带有标题的文章对象,我想在标题中包含关键字的树中查找并打印文章。但是,我不希望程序打印出超过 10 个(例如,1 个字母的关键字可能导致程序停止或崩溃)。代码在这里:

    public int traverse(String key) {
    if (root == null) {
        System.out.println("Empty Tree!");
        return 0;
    } else {
        int n = traverseHelper(root, key, 0);
        return n;
    }
}

public int traverseHelper(Node t, String key, int n) {
    if (t == null) {
        return n;
    } else {
        if (t.data.getTitle().indexOf(key) >= 0 && n <= 10) {
            System.out.println(t.data);
            n++;
        }
        return traverseHelper(t.left, key, n) + traverseHelper(t.right, key, n);
    }
}

我正在尝试记录程序打印数据的次数,但我不完全确定如何打印。目前,该程序打印所有事件,或非常接近它。我知道我的递归方法有问题(无论如何我从来都不擅长递归),所以我将不胜感激对我做错的事情的一个很好的解释。不过,这是家庭作业,所以我不希望有明确的解决方案。 其他几件事: traverse 函数的目的是打印出文章,所以我很可能稍后会将其更改为 void 方法。它目前应该返回打印文章的最终计数。此外,树的设置与任何其他 BST 一样,但如有必要,我会澄清我的代码。

谢谢!

【问题讨论】:

    标签: java recursion tree binary-tree binary-search-tree


    【解决方案1】:

    由于您使用 n 计数,因此您只能将 n 传递给其中一个叶子,或者您可以像这样嵌套它们:

    public int traverseHelper(Node t, String key, int n) {
        if (t == null) {
            return n;
        } else {
            if (t.data.getTitle().indexOf(key) >= 0 && n <= 10) {
                System.out.println(t.data);
                n++;
            }
            return traverseHelper(t.left, key, traverseHelper(t.right, key, n));
        }
    }
    

    这样的嵌套会稍微减少堆栈的使用,因为您没有额外的添加,并且左侧变成了尾调用。 Java 没有tail call optimization,但写得好像有。

    【讨论】:

      【解决方案2】:

      我看到的问题是 n 变量。

      你会的

      return traverseHelper(t.left, key, n) + traverseHelper(t.right, key, n);
      

      因此,如果 n 一开始是 5,那么即使没有找到任何项目,您的方法也会返回 10(每个分支 5 个)

      使函数只返回在子树中找到的项目数。

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 2012-01-26
        • 1970-01-01
        • 2013-03-10
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        相关资源
        最近更新 更多