C实现中的多路树搜索算法

时间:2012-11-23 14:06:24

标签: c search tree multiway-tree

typedef struct dt {
    .....;
} Data;

typedef struct nd {
    int id;
    Data *data;
    struct tm *_parent;
    struct tm *_child[7];
} Node; 


Node* findNode(int id, Node *tree) {
    Node *p = tree;
    if (id == p->_id)
        return p;
    for (int i = 0; i < 7; i++) {
        if (id == p->_child[i]->_id) {
            p = p->_child[i];
            break;
        } else if(p->_child[i] != NULL) {
            findNode(id, p->_child[i]);
        }
    }

    return p;
}

我有一个多路树,每个节点由0-7个孩子组成。可以不按特定顺序添加和删除儿童。我正在尝试构建一个搜索算法,给定id将搜索树并返回指向特定节点的指针。我试图像上面那样递归地做,没有太多运气。实际上是否可以递归地构建这个算法,还是我还需要使用堆栈?

2 个答案:

答案 0 :(得分:1)

  

是否可以递归地构建此算法?

是的,可以使用递归来完成此操作。

你走在正确的轨道上。代码只需要几个修复:

  1. if (id == p->_child[i]->_id)...的第一部分是完全冗余的,因为它复制了递归调用将要执行的操作(并且无法检查孩子是NULL)。
  2. 当函数以递归方式调用自身时,将忽略返回值。您需要弄清楚如何处理该返回值。

答案 1 :(得分:0)

您的最终条件存在一些问题。如果循环没有找到id,则必须通过返回值检测它。在这种情况下将其设为NULL将是明智的。这可以通过进行两个更改来完成:而不是设置p并执行break,直接返回它(这样,for循环只有在找不到id时才会完成),并将最后的return p更改为return NULL。

然后在进行递归调用时,需要检查返回值。如果为NULL,则继续。否则返回。

前面的答案是正确的,也可以更好地删除子id的检查,特别是因为它需要(但不是)检查NULL。