【问题标题】:Print n largest values from BST从 BST 打印 n 个最大值
【发布时间】:2015-01-16 02:24:04
【问题描述】:

我正在尝试从 BST 打印 n 最大值,指针肯定有问题,这是我的部分代码。

    void bt_printN(node *leaf,int *n)
{
    if((leaf != NULL) && *n > 0)
    {
        bt_printN(leaf->right,n);
        printf("%s %d\n",leaf->word, leaf->i);
        *n--;
        bt_printN(leaf->left,n);
    }
}

这不起作用,将n 值传递给这样的递归函数的正确方法是什么?

【问题讨论】:

  • 通行证OK;不是减量。 *n-- 递减指针,而不是指向的值;你需要(*n)-- 来减少值。其他一切是否正常是一个单独的讨论;看起来它更有可能打印 N 个最小值 - 除非,正如已经指出的那样,你先做 RHS,所以......毕竟你可能没问题。
  • Coudl 你把它发布为答案,所以我会接受它
  • @WhozCraig:是的,我看到它将首先使用最大值。我怀疑代码应该在递归 onleaf->right 之后检查*n > 0,然后再打印出当前节点,因为n 的值可能通过调用缩小了。

标签: c algorithm pointers binary-search-tree


【解决方案1】:

主要问题不是您传递n 的方式;主要问题是*n-- 递减指针,而不是指向的值。您需要(*n)-- 来减少指向的值。

修复该问题后,您的代码大部分都在那儿了——尽管我的红鲱鱼 cmets 关于“最小优先”。但是,我认为您需要在递归调用bt_printN(leaf->right, n); 之后和函数打印自己的节点之前检查n。您不必在第二次递归调用之前进行检查,尽管这样做可能是一个次要(最小)的优化。如所写,如果 *n == 1 在入口处,它会向右递归,但随后沿 RHS 向下的每个节点都会打印其值,即使只需要一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多