我的二进制树在C中有下一个结构代码:
struct student
{
int studentID;
char lastName[MAX_LENGTH];
char firstName[MAX_LENGTH];
float amount;
};
struct node
{
struct student* record;
struct node* left;
struct node* right;
};
使用studentID字段作为键将记录插入树中。当我按照studentID的顺序打印树时,一切都很好。但我想按照lastName字段的顺序打印SAME树。
我只有一个想法:将树复制到数组,排序数组和显示数组。
还有其他解决方案吗?
答案 0 :(得分:1)
您可以并行构建和维护多个二叉搜索树,可选择将它们折叠成单个多索引数据结构:
struct node {
struct student *record;
struct node *left_by_id, *right_by_id,
*left_by_name, *right_by_name;
};
显然,必须修改所有BST操作才能使其正常工作:例如要插入新的struct student*
,您必须将一个node
绑定到两棵树中。
答案 1 :(得分:0)
为lastName创建索引。您可以使用另一个BST,它将lastName作为键存储,并指向原始BST中相应节点的指针。
struct indexNode {
char lastName[MAX_LENGTH]
struct node* originalNode;
};
您可以在原始树中插入数据时继续插入此树。
这样您就必须花费O(log n)
空间来存储额外的索引树,但会将基于lastName的搜索时间减少到O(log n)
。此外,实际上您将只存储每个元素的节点的键和指针。