该函数接收参数节点(具有成员名称)和str(要搜索的名称)
{
if (node == NULL) return NULL;
if (strcmp(node->name, str) == 0) return node;
node = search_RtLR(node->left, str);
if (node != NULL) return node;
node = search_RtLR(node->right, str);
if (node != NULL) return node;
return NULL;
}
当我搜索左子树中的名称时,它可以工作,但是当我在右子树中搜索时,程序终止(当树中没有这样的名字时),我找不到什么错。树没有按字母顺序排序。
答案 0 :(得分:3)
您正在覆盖节点参数变量:
node = search_RtLR(node->left, str); // overwriting node here at assignment
if (node != NULL) return node;
node = search_RtLR(node->right, str); // node is NULL here, look at line above!
你不应该!
将参数定义为const(因为这是一个不会更改任何数据的函数)也有帮助(因为编译器会在您尝试覆盖const变量时发出警告):
Node* search_RtLR(const Node* node, const char* str) {
if (node == NULL) return NULL;
if (strcmp(node->name, str) == 0) return node;
const Node* newNode = search_RtLR(node->left, str);
if (newNode != NULL) return newNode;
return search_RtLR(node->right, str);
}
答案 1 :(得分:0)
当字符串不在leftsubtree中时,递归搜索返回NULL,您将其分配给node
。然后,search_RtLR(node->right, str)
搜索“无处”'。您不应该覆盖node
:
if (node == NULL) return NULL;
if (strcmp(node->name, str) == 0) return node;
node1 = search_RtLR(node->left, str);
if (node1 != NULL) return node1;
node1 = search_RtLR(node->right, str);
if (node1 != NULL) return node1;
return NULL;