我将二叉树定义为搜索表。树是链表二进制树,节点就像
typedef struct node{
int key;
char *buf;
...
}node_t;
typedef table_t node_t *; 所以我有像
这样的功能 insert(table_t table, node_t node)
search(table_t table, node_t node)
现在我有多个键,比如
typedef struct node{
int key1;
int key2;
char *buf;
...
}node_t;
我希望有以下功能:
search_by_key1(table_t table, node_t node, int key1)
search_by_key2(table_t table, node_t node, int key2)
实际上,它就像一个数据库,我可以搜索项目的任何键。
有没有源代码示例?我正在使用linux C 谢谢!
答案 0 :(得分:1)
二叉树只能用一个键索引。
如果要使用多个键进行索引,可以为每个键构建一个元树,元树有元节点,其中:
typedef struct meta_node
{
int index;
node * data;
...
}
meta_node_t;
答案 1 :(得分:0)
嗯,在二叉树中,键只对彼此有意义。这意味着只有当key1_b在右分支中更大/更小时,key1_a在左分支才有意义(取决于你如何构造它)。如果你有一组两组密钥,假设它们具有相同的比例,它们可以在同一个树数据结构中。如同,如果key2中的每个键恰好高于key1 50。但这根本不会有用。
我唯一的想法是使它有一些空值键。因此,如果你正在遍历你的树而你正处于key1的叶子而不是key2,那么你只需继续前进,而下部的其余部分将在键中具有空值(可能为-1?),或者将有一个布尔触发器,使得key1不再出现在树的这个分支中。这有点难以描述,但你明白我的意思吗?就像基本上把它当作两个交织的树一样对待它们,然后一起走,直到你必须分开(并且保持实际的树结构相同,但其中一个键具有空值)
虽然听起来过于复杂,所以我不知道它是否值得。
答案 2 :(得分:0)
你可以有两棵树,但仍然使用相同的节点:
struct basic_node {
int key;
struct basic_node *left, *right;
struct node *node;
};
struct node {
struct basic_node tree1;
struct basic_node tree2;
char *data;
};
struct node *tree1_root, *tree2_root;
创建节点时,您将分配struct node
,然后根据其密钥将每个basic_node
分别插入相应的树。在每个basic_node
中,将node
指针设置为包含它的节点。
查找时,只需从树根开始,然后进行简单的查找,这将导致您转到所需的basic_node
,然后转到节点本身。
如果你想删除,你必须首先从两个树中取消链接节点,然后你可以释放它。
答案 3 :(得分:0)
我知道这个问题是很久以前问过的,但是我在搜索用户正在寻找的确切数据结构时碰到了它。
长话短说, 可能有一个带有多个关键字的二叉搜索树,称为K-D树。
基本上,您要做的是构造一个普通的二进制搜索树,但是您要跟踪节点在树中的“深度”。对于此问题使用的两个键,所有具有深度的偶数节点均根据key_a的值对其子级进行排序,而所有具有奇数深度的节点均根据key_b的值对其子级进行排序。
类似地,当您搜索树时,您会遍历树枝。当您在深度均匀的节点上时,您可以根据存储在该节点的key_a中的值是小于还是大于key_a的所需值来决定要下降的分支。当您位于奇数深度的节点上时,您将根据该节点的值和key_b的所需值来决定。
如果我没记错的话,谷歌使用非常相似的数据结构,以地理位置为基础,以纬度为一个键,以经度为另一个来快速查找位置。