在C中以二叉树递归搜索

时间:2015-04-22 20:08:01

标签: c binary-tree

该函数接收参数节点(具有成员名称)和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;
}

当我搜索左子树中的名称时,它可以工作,但是当我在右子树中搜索时,程序终止(当树中没有这样的名字时),我找不到什么错。树没有按字母顺序排序。

2 个答案:

答案 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;