二叉树:查找相同的值

时间:2016-07-23 19:02:37

标签: c data-structures insert find binary-search-tree

我一直在慢慢编写一个程序并试图自学二叉树。该程序是使用树存储其数据的电话簿。我目前卡在我的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;
}

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

为什么不在

后添加另一张支票
if (p == NULL) {
    p = createNode(NULL, NULL, e);
}

查看pe的名字和姓氏是否相等? (当然假设树中的每个条目都有名字和姓氏)。我在这个陈述之后说,因为你不想将空对象与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;
}