[英]binary tree recursively search c code [not Binary Search Tree]
我的代码的问题是,当搜索左子级值时,由于要执行递归级别,它将返回并检查右子级值。返回的结果不正确。 我找不到办法克服它。
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';
}
}
也许像这样
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;
}
那就对了。 尝试这个:
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;
}
}
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);
}
注意:两者||
和?:
使用短路评估,这使我可以将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);
}
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
。 检查此问题以获取更多详细信息-NULL,'\\ 0'和0之间有什么区别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.