我知道这可能是一个简单的问题但是我已经有一段时间了,因为我已经完成了任何C编程。我试图在x节点上执行inorder遍历,其中x是我传递给函数的一些数字。我的inorder函数是递归调用自身的,并且对于我的生命我无法想象如何在访问x节点之后停止遍历。这是我的inorder遍历函数:
void inorder(node h)
{
if (h != NULL)
{
inorder(h->l);
printf(" %d\n",h->item);
inorder(h->r);
}
return;
}
非常感谢任何指导。
答案 0 :(得分:1)
假设“访问次数”是您要从有序遍历中打印出来的节点数。一种解决方案是使inorder
函数返回剩余要打印的节点数,并在遍历树时检查它。
int inorder(node h, int x)
{
// I mimic your current code. The code is indeed shorter, but it will
// do extra recursion, compared to the other approach of checking
// for the subtree and value of x before the recursive call.
if (h != NULL && x > 0)
{
x = inorder(h->l, x);
if (x > 0) {
printf(" %d\n",h->item);
x--;
}
x = inorder(h->r, x);
}
return x;
}
实现中的另一个细微变化是将指针传递给包含x
的变量,并使用它来更新计数器。如果以这种方式编写,该函数不需要返回任何内容。
void inorder(node h, int *x)
{
// I mimic your current code. The code is indeed shorter, but it will
// do extra recursion, compared to the other approach of checking
// for the subtree and value of x before the recursive call.
if (h == NULL && *x > 0)
{
inorder(h->l, x);
if (*x > 0) {
printf(" %d\n",h->item);
(*x)--;
}
inorder(h->r, x);
}
}
答案 1 :(得分:0)
试试这个 - 应该只对访问过的x个节点起作用(其中访问的节点数是可以打印的节点);
int inorder(node h, int x)
{
if (h != NULL && x > 0)
{
x = inorder(h->l, x);
if (x > 0) {
printf(" %d\n",h->item);
x--;
}
if (h->r && x > 0)
x = inorder(h->r, x);
}
return x;
}
[编辑:在对访问过的节点定义和减少x的值进行一些讨论之后,此代码由 @nhahtdh 更正。可以看到工作测试代码here。