我一直在慢慢编写一个程序并试图自学二叉树。该程序是使用树存储其数据的电话簿。我目前卡在我的findOrInsert函数上。最初我只是将数据插入开放区域。现在我想在添加之前检查数据是否已经存在。如果确实如此,则返回提示用户的功能已经存在相同的数据。我尝试过一些东西,但没有运气。我可能只是尝试从头开始重写它。在此之前,我想知道我是否能得到任何帮助。
这就是我现在所拥有的。
struct treeNode * findOrInsert(struct treeNode *p, Entry e) {
if (p == NULL) {
p = createNode(NULL, NULL, e);
}
else if (strcmp(e.fName, p->data.fName) < 0) {
p->left = findOrInsert(p->left, e);
}
else if (strcmp(e.fName, p->data.fName) > 0) {
p->right = findOrInsert(p->right, e);
}
else {
if (strcmp(e.lName, p->data.lName) < 0) {
p->left = findOrInsert(p->left, e);
}
else if (strcmp(e.lName, p->data.lName) > 0) {
p->right = findOrInsert(p->right, e);
}
else {
return p;
}
}
return p;
}
struct treeNode * createNode(struct treeNode *q, struct treeNode *r, Entry e) {
struct treeNode * newNode;
newNode = (struct treeNode*)(malloc(sizeof(struct treeNode)));
newNode->data = e;
newNode->left = q;
newNode->right = r;
return newNode;
}
感谢任何帮助!
答案 0 :(得分:0)
为什么不在
后添加另一张支票if (p == NULL) {
p = createNode(NULL, NULL, e);
}
查看p
和e
的名字和姓氏是否相等? (当然假设树中的每个条目都有名字和姓氏)。我在这个陈述之后说,因为你不想将空对象与e
进行比较。因此,一旦确认p
确实存在,您应该检查e
的名字和姓氏是否等于p
的名字。如果是这样,那么打印出e
已经存在于树或其他任何内容并返回p
以结束递归(返回某些内容的替代方法是抛出异常,但这会停止程序的执行)。看起来应该是这样的,
else if (strcmp(e.fName, p->data.fName) == 0 && strcmp(e.lName, p->data.lName) == 0) {
printf("Entry already exists in tree");
return p;
}