在中序遍历中,如何从一个递归到下一个递归保存一个元素?
How do you hold an element from one recurse until the next recurse in an in-order traversal?
我正在验证 BST。如果要按顺序遍历树,它将按排序顺序输出值。此外,如果将前一个元素与当前元素进行比较,则可以验证它是否排序:
其中 A 是任何排序列表:
我不想按顺序遍历值并将它们存储到数组中以验证(O(n) space 复杂度),而是想保留前一个元素并在下一个递归时检查它。例如:
在中序遍历中,我会得到 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);
}
}
很明显这段代码只是做了一个中序遍历。我已经四处搜索和阅读,但找不到任何明确的内容。如何存储从一个递归周期到下一个递归周期的值?
这是一种方法:
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 时,无需检查。
希望对您有所帮助。
这里我们通过引用传递一个名为 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);
}
}
您可以从这里相应地更改您的代码。
您也可以查看下面的 link
希望你明白了。
我正在验证 BST。如果要按顺序遍历树,它将按排序顺序输出值。此外,如果将前一个元素与当前元素进行比较,则可以验证它是否排序:
其中 A 是任何排序列表:
我不想按顺序遍历值并将它们存储到数组中以验证(O(n) space 复杂度),而是想保留前一个元素并在下一个递归时检查它。例如:
在中序遍历中,我会得到 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);
}
}
很明显这段代码只是做了一个中序遍历。我已经四处搜索和阅读,但找不到任何明确的内容。如何存储从一个递归周期到下一个递归周期的值?
这是一种方法:
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 时,无需检查。
希望对您有所帮助。
这里我们通过引用传递一个名为 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);
}
}
您可以从这里相应地更改您的代码。
您也可以查看下面的 link
希望你明白了。