我想在C中实现一个递归函数,其中返回值是二叉树中节点的父节点。作为参数,我有t
,即所讨论的树和字符n
,即节点的名称。我想找到这个节点的父节点。我试图这样做,但它没有用。
Tree*
tree_par (Tree* t, char n)
{
if (!tree_null(t))
{
if (info(t->lft) || info(t->rgt) == n)
return t;
else
{
tree_par(t->lft, n);
tree_par(t->rgt, n);
}
}
}
函数info
返回节点的名称,函数tree_null
检查树是否为空。这是树结构:
struct tree
{
struct tree *lft, *rgt; //left node and right node
char n;
};
info function:
char
info (Tree* t)
{
return t->n;
}
tree_null函数:
int
tree_null (Tree* t)
{
return (t == NULL);
}
答案 0 :(得分:1)
if (info(t->lft) || info(t->rgt) == n)
return t;
这是问题所在。 ||
运算符的两边是彼此独立的,所以这不等于
if (info(t->lft) == n || info(t->rgt) == n)
这就是你想要的。
您必须在||
if (info(t->lft) == n || info(t->rgt) == n)
return t;
编辑,请注意,如果你这样做
else
{
tree_par(t->lft, n);
tree_par(t->rgt, n);
}
您实际上是在丢弃递归函数调用的返回值,您需要更改它以检查两个递归调用中的哪一个(如果有)成功;另外,不要忘记为空树添加类似return NULL
的内容,否则将获得未定义的返回值。
它将类似于:
Tree* tree_par (Tree* t, char n)
{
if (!tree_null(t))
{
if ((info(t->lft) == n) || (info(t->rgt) == n))
return t;
else
{
Tree tt*;
tt=tree_par(t->lft, n);
if (tt==NULL)
tt= tree_par(t->rgt, n);
return tt;
}
}
else
return NULL;
}