【问题标题】:BST In-Order Traversal Using Recursion使用递归的 BST 中序遍历
【发布时间】:2015-10-22 18:40:18
【问题描述】:

我使用了搜索功能,虽然我找到了一些类似的主题,但我没有找到一个完全涵盖我的问题的主题。

我正在尝试使用递归和中序遍历来查找 BST,因此我想跟踪元素的位置。

我有以下代码,但它没有做我想要做的事情。它正在做正确的遍历,但位置不正确。

void startProces(int x)
{
void inOrder(x,*n,*Position)
}

void inOrder(int x, Node *n, int *Position)
{
    int counter = *Position;
    counter++;
    Position = &counter;
}

这是一个家庭作业,所以请避免给我一个直接的解决方案。另外请避免给我一个建议,因为我被锁定时必须重写函数参数。我希望能深入了解为什么我的位置值没有正确增加。我知道一旦找到值,我的函数目前就没有做任何事情。一旦我发现了这个问题,我就计划实施它。

澄清:我有插入功能,这里没有展示。如果我插入节点 (15,5,3,12,10,13,6,7,16,20,18,23),我会得到有序遍历 (3,5,6,7,10,12, 13、15、16、18、20、23)。我希望这对应于(1,2,3,4,5,6,7,8,9,10,11,12)。最终,当我运行 startProcess(10) 之类的东西时,我希望 inOrder 打印 5。

【问题讨论】:

  • 你是如何给你的节点编号的?
  • 嗨,Jason,我更新了原始帖子,提供了更多信息。如果仍然不能回答您的问题,请告诉我。

标签: c++ recursion binary-search-tree


【解决方案1】:

您的代码在堆栈上复制一个变量并传递该变量的地址。因此,对于每个子节点,其值将始终是父节点的值加一,而不是之前遍历的节点的值加一。

具体来说,这一行复制了它...

int counter = *Position;

变量Position是一个指针,其中counter是一个局部变量。指针指向您使用& 给它的地址。每次调用 inOrder 时,它都会创建一个新的 counter 变量,该变量的作用域是该函数调用。

那么,这条线...

Position = &counter;

在上述函数调用中设置指向counter 实例的指针。您需要做的就是传递一个指向特定实例而不是副本的指针。

【讨论】:

  • 是的,我注意到它看起来与打印深度非常相似。我不完全确定如何获得以前遍历的笔记值。递归让我失望。我会花一些时间考虑这个问题,如果我取得任何进展,我会回帖。谢谢。
  • @JohnKraz 我添加了更多信息。
  • 杰森,非常感谢您的补充解释。这很有意义。我完全忘记了使用指向 int 的指针这一事实。
猜你喜欢
  • 2021-05-28
  • 1970-01-01
  • 2016-12-15
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多