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将搜索树并返回指向特定节点的指针。我试图像上面那样递归地做,没有太多运气。实际上是否可以递归地构建这个算法,还是我还需要使用堆栈?
答案 0 :(得分:1)
是否可以递归地构建此算法?
是的,可以使用递归来完成此操作。
你走在正确的轨道上。代码只需要几个修复:
if (id == p->_child[i]->_id)...
的第一部分是完全冗余的,因为它复制了递归调用将要执行的操作(并且无法检查孩子是NULL
)。答案 1 :(得分:0)
您的最终条件存在一些问题。如果循环没有找到id,则必须通过返回值检测它。在这种情况下将其设为NULL将是明智的。这可以通过进行两个更改来完成:而不是设置p并执行break,直接返回它(这样,for循环只有在找不到id时才会完成),并将最后的return p更改为return NULL。
然后在进行递归调用时,需要检查返回值。如果为NULL,则继续。否则返回。
前面的答案是正确的,也可以更好地删除子id的检查,特别是因为它需要(但不是)检查NULL。