之前我问了一个类似的问题,但现在我正在寻找一个为什么这不起作用而不是“帮助我解决”。
我必须创建一个如下所示的通用树:
1
/
v
2->3->4
/ /
v v
5-6-7 8-9
我的搜索方法,我用于课堂上的其他方法,是
gennode* general::search(int element, gennode *t){
if(t == NULL)
{
return t;
}
if(t->item == element)
{
return t;
}
if(t->siblingList != NULL)
{
return search(element, t->siblingList)
}
return search(element, t->firstChild)
}
其中firstChild是图片中的垂直指针,siblingList是图片中的水平指针。
我的问题是它没有找到5,6或7(2的孩子)。
递归堆栈看起来像这样(至少我认为它应该在我脑海中):
search(5, *1)
search(5, *2)
search(5, *3)
search(5, *4)
search(5, *8)
search(5, *9)
return NULL(from *9)
return NULL(from *8)
return NULL(from *3)
search(5, *5)
return(*5) the rest of the way up.
有谁知道我迷路的地方?
答案 0 :(得分:1)
您需要在兄弟搜索中控制NULL结果:
gennode* general::search(int element, gennode *t){
if(t == NULL)
{
return t;
}
if(t->item == element)
{
return t;
}
gennode* result = NULL;
if(t->siblingList != NULL)
{
result = search(element, t->siblingList)
}
if(result==NULL)
{
result = search(element, t->firstChild);
}
return result;
}
答案 1 :(得分:1)
问题在于
if(t->siblingList != NULL)
{
return search(element, t->siblingList)
}
如果有兄弟姐妹,则返回语句会在任何情况下返回函数,如果找到了某些东西则独立返回。
在节点2上,你将返回3作为兄弟,并且永远不会尝试“孩子”下降。
这种方式应该是正确的
gennode* general::search(int element, gennode *t)
{
if(t == NULL) //no search at all
{ return NULL; }
if(t->item == element) // found
{ return t; }
gennode* z = search(element, t->siblingList);
if(z) return z; // if found return, otherwise ....
return search(element, t->firstChild); //... try the other way round
}
答案 2 :(得分:1)
你的问题在这里,它是t-> siblingList!= NULL你从来没有得到t-> FirstChild。
gennode* general::search(int element, gennode *t){
if(t == NULL)
{
return t;
}
if(t->item == element)
{
return t;
}
gennode* sibValue = search(element, t->siblingList);
if(sibValue != NULL)
{
return sibValue;// <-- only return if you have a valid value.
}
return search(element, t->firstChild)
}