linux C中二进制搜索树的多个搜索键

时间:2013-06-09 17:34:34

标签: c algorithm search

我将二叉树定义为搜索表。树是链表二进制树,节点就像

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 谢谢!

4 个答案:

答案 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的所需值来决定。

如果我没记错的话,谷歌使用非常相似的数据结构,以地理位置为基础,以纬度为一个键,以经度为另一个来快速查找位置。