我的代码的问题在于,当搜索左子值时,由于递归级别,它会返回并检查正确的子级。并且返回不正确。我无法找到一种方法来克服它。
node * search(node *ptr,int key)
{
if(ptr->data==key)
return ptr;
else
{
if(ptr->lchild!='\0')
search(ptr->lchild,key);
else
return '\0';
if(ptr->rchild!='\0')
search(ptr->rchild,key);
else
return '\0';
}
}
答案 0 :(得分:4)
也许就像这样
node * search(node *ptr,int key)
{
node *pwk;
if(ptr == NULL) return NULL;
if(ptr->data==key)
return ptr;
if(NULL!=(pwk=search(ptr->lchild,key)))
return pwk;
if(NULL!=(pwk=search(ptr->rchild,key)))// or return search(ptr->rchild,key);
return pwk;
return NULL;
}
答案 1 :(得分:1)
没错。试试这个:
node * search(node *ptr,int key)
{
if(ptr->data==key)
return ptr;
else
{
node *current = NULL;
if(ptr->lchild != NULL)
current = search(ptr->lchild,key);
if(current == NULL) /* not found in the left subtree */
{
if(ptr->rchild != NULL)
current = search(ptr->rchild,key);
}
return current;
}
}
答案 2 :(得分:1)
Node *search(Node *ptr, int key)
{
Node *found;
if ( !ptr || ptr->data == key) return ptr;
found = search(ptr->lchild, key);
return (found) ? found : search(ptr->rchild, key);
}
注意:||
和?:
都使用short circuit评估,这样我就可以将if(...)
条件的数量减少到一个。
更新:如果我们被允许使用“残缺三元”运算符gnu-extension,我们也可以避免变量:
Node *search2(Node *ptr, int key)
{
if ( !ptr || ptr->data == key) return ptr;
return search2(ptr->lchild, key) ?: search2(ptr->rchild, key);
}
添加另一个三元组会完全删除if(...)
:
Node *search3(Node *ptr, int key)
{
return ( !ptr || ptr->data == key)
? ptr
: search3(ptr->lchild, key) ?: search3(ptr->rchild, key);
}
答案 3 :(得分:0)
node * search(node *ptr,int key)
{
Node * p;
// Found the key, return the pointer to the node
if (ptr->data==key)
return ptr;
if (ptr->lchild != NULL)
{
p = search(ptr->lchild,key);
// Found the key, return the pointer to the node
if(p != NULL)
return p;
}
// Didn't find it in the lchild, so search rchild
if (ptr->rchild != NULL)
{
p = search(ptr->rchild,key);
// Found the key, return the pointer to the node
if(p != NULL)
return p;
}
// Not found in left or right child, return NULL
return NULL;
}
在这种情况下避免使用\0
。 \0
用于空字符。 NULL
用于空指针。虽然两者通常都是0,但最好使用NULL
作为指针。请查看此问题以获取更多详细信息 - What is the difference between NULL, '\0' and 0