在C中的二叉树中递归搜索
Search recursively in binary tree in C
函数接收参数节点(有成员名称)和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;
}
当我搜索左子树中的名称时,它有效,但当我在右子树中搜索时,程序终止(当树中没有这样的名称时也是如此),我找不到问题所在.树未按字母顺序排序。
您正在覆盖您的节点参数变量:
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);
}
当字符串不在左子树中时递归搜索returns NULL,您将其分配给node
。然后 search_RtLR(node->right, str)
搜索 'nowhere'。你不应该覆盖你的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;
函数接收参数节点(有成员名称)和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;
}
当我搜索左子树中的名称时,它有效,但当我在右子树中搜索时,程序终止(当树中没有这样的名称时也是如此),我找不到问题所在.树未按字母顺序排序。
您正在覆盖您的节点参数变量:
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);
}
当字符串不在左子树中时递归搜索returns NULL,您将其分配给node
。然后 search_RtLR(node->right, str)
搜索 'nowhere'。你不应该覆盖你的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;