【问题标题】:Search recursively in binary tree in C在C中的二叉树中递归搜索
【发布时间】:2015-04-23 04:25:13
【问题描述】:

函数接收参数node(有成员名)和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;
}

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

【问题讨论】:

    标签: c binary-tree


    【解决方案1】:

    您正在覆盖您的节点参数变量:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      当字符串不在左子树中时,递归搜索返回 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-14
        • 2014-01-02
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 2021-07-03
        • 2019-04-17
        • 1970-01-01
        相关资源
        最近更新 更多