C++ 在顺序遍历中,如何将元素从一个递归保持到下一个递归?

C++ 在顺序遍历中,如何将元素从一个递归保持到下一个递归?,c++,algorithm,sorting,recursion,binary-search-tree,C++,Algorithm,Sorting,Recursion,Binary Search Tree,我正在验证BST。如果要按顺序遍历树,它将按排序顺序输出值。此外,如果将上一个元素与当前元素进行比较,则可以验证其排序: 其中A是任何已排序的列表: 我不是为了遍历这些值并将它们存储到一个数组中以验证(O(n)空间复杂性),而是希望保留上一个元素并在下一个递归中检查它。例如: 在顺序遍历中,我将得到1 3 4 6 7 8 10 13 14。这是有序的,符合我写的方程,是一个二叉树。我遇到的问题是编写(和理解)递归,它将允许我保留以前的值。我想使用1(基本情况)并将其保持到下一个元素,即3。我

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

其中A是任何已排序的列表:

我不是为了遍历这些值并将它们存储到一个数组中以验证(O(n)空间复杂性),而是希望保留上一个元素并在下一个递归中检查它。例如:

在顺序遍历中,我将得到1 3 4 6 7 8 10 13 14。这是有序的,符合我写的方程,是一个二叉树。我遇到的问题是编写(和理解)递归,它将允许我保留以前的值。我想使用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);
    }
}
void顺序(Root*Root)
{
根*先前;
if(root==NULL)
返回;
其他的
{
上一个=根;
顺序(根->左);
cout data这里有一种方法:

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);
}
bool索引顺序(Root*Root,int*min,int*max)
{
返回根==NULL||
(按顺序(根->左、最小和根->数据)&&
(min==NULL | |*mindata)&&
(max==NULL | | root->data<*max)&&
顺序(根->右,&根->数据,最大值);
}
布尔索引(根*根)
{
顺序(根,空,空);
}
基本上,传递两个附加参数并检查当前值是否在范围内(最小值、最大值)。 在左边的递归中,你改变了你的最大值,在右边的递归中,你改变了你的最小值

我传递指针,这样当它为空时,就不需要检查了


希望对您有所帮助。

这里我们通过引用传递一个变量,名为
prev
。我已使用
climits
头文件中的INT_MIN初始化了
prev
,或者您可以使用小于所有BST值的值初始化它

void InOrder(struct node* root, int& prev)
{
    if (root == NULL)
        return ;

    else
    {
        InOrder(root->left,prev);
        if(prev<root->data)
        {
            prev = root->data;
            //printf("prev is %d\n",prev);
        }
        cout << root->data << endl;
        InOrder(root->right,prev);
    }
}
void索引顺序(结构节点*root、int和prev)
{
if(root==NULL)
返回;
其他的
{
顺序(根->左,上);
如果(数据)
{
prev=根->数据;
//printf(“prev是%d\n”,prev);
}
cout数据权限(上一页);
}
}
您可以从此处相应地更改代码。
您还可以查看以下内容

希望您能理解。

这里有一个提示:如果您向每个节点传递最小值和最大值,您可以检查树是否为BST。对于第一个节点,传递最小整数和最大整数。向下遍历时,在递归时根据需要更改最小/最大值。此外,您的InOrder函数不需要保留上一个或前一个另一种方法是传递一个引用到一个保存最后一个检查值的变量。我会使用@AnonMail的解决方案,因为你所需要的只是验证你是否有一个有效的BST。你尝试用这种方法验证树是否是BST有什么原因吗?有一种更简单、更简洁的方法来验证树是否是BST。