c++ - 在中序遍历中,如何从一个递归到下一个递归保存一个元素?

标签 c++ algorithm sorting recursion binary-search-tree

我正在努力验证 BST。如果要按顺序遍历树,它将按排序顺序输出值。此外,如果将前一个元素与当前元素进行比较,则可以验证它是否排序:

其中 A 是任何排序列表:

equation for sorted list

我不想按顺序遍历值并将它们存储到数组中以验证(O(n) 空间复杂度),而是想保留前一个元素并在下一个递归时检查它。例如:

Binary tree

在中序遍历中,我会得到 1 3 4 6 7 8 10 13 14。这是有序的,符合我写的等式,并且是一棵二叉树。我遇到的问题是编写(和理解)递归,这将使我能够保持以前的值(value)。我想到达 1(基本情况)并将它保持到下一个元素,即 3。我确认 3 大于 1,然后 3 成为前一个,我将它保持到下一个元素。下一个元素是 4,我确认 4 大于 3,然后我保持 4 直到下一个元素......等等。

这是我的代码:

void InOrder(Root* root)
{
    Root* previous;

    if (root == NULL)
        return;

    else
    {
        previous = root;

        InOrder(root->left);
        cout << root->data << " " << previous->data << endl;
        InOrder(root->right);
    }
}

很明显这段代码只是做了一个中序遍历。我已经四处搜索和阅读,但找不到任何明确的内容。如何存储从一个递归周期到下一个递归周期的值?

最佳答案

这是一种方法:

bool InOrder(Root* root, int *min, int *max)
{
  return root == NULL ||
         (InOrder(root->left, min, &root->data) &&
          (min == NULL || *min < root->data) &&
          (max == NULL || root->data < *max) &&
          InOrder(root->right, &root->data, max));
}

bool InOrder(Root *root)
{
  InOrder(root, NULL, NULL);
}

基本上,您传递两个额外的参数并检查当前值是否在范围(最小值、最大值)内。 在左递归中,你改变了你的最大值,在右递归中——你的最小值。

我正在传递指针,因此当它为 NULL 时,无需检查。

希望对您有所帮助。

关于c++ - 在中序遍历中,如何从一个递归到下一个递归保存一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043258/

相关文章:

algorithm - 随机快速排序划分概率

python - python中alpha排序最快的列表

mysql - 分割除奇数/偶数以外的数组的方法

c++ - C++中涉及多继承和复合类的解决设计

c++ - 在 Symbian 中理解字符串的教程

c++ - POSIX 计时器可以安全地修改 C++ STL 对象吗?

javascript - 查找日期范围内的可用天数

C++ 如何声明指向二维数组的指针

javascript - 使用高效算法对数组中的相同对进行计数

php - 对具有不确定数据的数组进行排序