这是一个我认为很容易的问题,但我发现最后我错了。我可以在没有递归的情况下完成程序,但我想问一下这个问题是否可以在递归版本中完成?
问问题
188 次
2 回答
2
递归二叉搜索树遍历基本上是(伪代码,以防这是课程作业):
def traverse (node):
if (node == NULL):
return
traverse (node.left)
doSomethingWith (node.payload)
traverse (node.right)
:
traverse (root)
这就是它的全部内容,只需替换doSomethingWith()
为您想做的任何事情(例如打印)。
这将以从左到右的顺序遍历,因此,如果您的 BST 以左表示较低的方式排序,只需交换两个traverse
调用。
例如,考虑以下树:
20
/ \
10 25
/ / \
5 24 27
/ /
2 28
如本示例 C 程序中所体现的:
#include <stdio.h>
typedef struct s {
int payload;
int left;
int right;
} tNode;
tNode node[] = { // Trust me, this is the tree from above :-)
{20, 1, 4}, {10, 2, -1}, { 5, 3, -1}, { 2, -1, -1},
{25, 5, 6}, {24, -1, -1}, {27, -1, 7}, {28, -1, -1}};
static void traverse (int idx) {
if (idx == -1) return;
traverse (node[idx].right);
printf ("%d ", node[idx].payload);
traverse (node[idx].left);
}
int main (void) {
traverse (0);
putchar ('\n');
return 0;
}
运行该程序将为您提供以下输出:
28 27 25 24 20 10 5 2
于 2012-11-30T05:42:41.127 回答
0
当然。假设 BST 的排序使得“大于”节点在右侧,“小于”节点在左侧,这样的递归函数将起作用:
void recurse(Node* node)
{
if (node == nullptr) return;
recurse(node->right); // Explore all the "greater than" nodes first
std::cout << node->value << std::endl; // Then print the value
recurse(node->left); // Then explore "less than" nodes
}
于 2012-11-30T05:42:58.997 回答