2016-07-23 118 views
0

我一直在慢慢地编写程序,并试图教我自己的二叉树。这个程序是一个使用树来存储数据的电话簿。我目前卡在我的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

为什么不只是简单地添加其他检查后

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; 
} 
+1

老实说我以为我试过。一定是做了一些不同的事情。它现在似乎工作。谢谢! – arthos455