[英]Search for an item in an n-ary tree
I have a tree n-ary composed in this way:我有一个以这种方式组成的树 n 元:
struct n_tree{
struct list *adj;
};
struct list{
struct n_tree *child;
struct list *next;
int key;
};
How i can search an item?如何搜索项目? I have implemented this function, but it does not work... Thanks!
我已经实现了这个功能,但它不起作用......谢谢!
struct list *find(struct list *root, int key){
if(root){
find(root->next,key);
if (root != NULL){
if(root->key == key){
return root;
}
else if(root->child != NULL){
return find(root->child->adj,key);
}
}
}
}
It seems that what you are trying to implement is a n-ary tree with a binary implementation (first child, right sibling).似乎您要实现的是具有二元实现(第一个孩子,右兄弟)的 n 元树。
It's more obvious with other namings :使用其他命名更明显:
struct n_tree{
struct list *root;
};
struct tree_node{
int key;
struct tree_node *first_child;
struct tree_node *right_sibling;
};
A recursive search function returning the node with the key key or NULL if no node is found could be :如果没有找到节点,则返回带有键key或 NULL 的节点的递归搜索函数可以是:
struct tree_node *find_node(struct tree_node *from, int key){
// stop case
if (from==NULL) return NULL;
if (from->key==key) return from;
// first we'll recurse on the siblings
struct tree_node *found;
if ( (found=find_node(from->right_sibling,key) != NULL ) return found;
// if not found we recurse on the children
return find_node(from->first_child, key);
}
If you need a wrapper function with a n_tree argument :如果您需要带有 n_tree 参数的包装函数:
struct tree_node* find(struct n_tree* tree, int key) {
return find_node(tree->root, key);
}
Before looking at the children, you need to look at the local node, since that's how you actually find things and end the recursion.在查看子节点之前,您需要查看本地节点,因为这就是您实际查找内容并结束递归的方式。
Also, doing a recursive call and ignoring the return value is pointless (unless there's an "out-parameter", which there isn't here).此外,进行递归调用并忽略返回值是没有意义的(除非有一个“输出参数”,这里没有)。 So don't do that.
所以不要那样做。
Here is (possibly the smallest) modification of your code to achieve your goal:这是(可能是最小的)代码修改以实现您的目标:
struct list *find(struct list *root, int key){
for(; root != NULL; root = root->next){ // scan the siblings' list
if(root->key == key) // test the current node
return root; // return it if the value found
if(root->child != NULL) { // scan a subtree
struct list *result = find(root->child->adj, key);
if(result) // the value found in a subtree
return result; // abandon scanning, return the node found
}
}
return NULL; // key not found
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.