[英]Adding nodes to Binary Search Tree
免责声明:这是一项作业。 我并不是在寻求明确的代码答案,而只是帮助理解为什么我的代码无法正常工作。
我正在尝试实现基本的二进制搜索树,但是我的_addNode(...)
函数遇到问题。
这是问题所在。 当我使用调试器遍历代码时,我注意到叶节点是在两侧(左右)无限创建的,因此,除了创建根之外,叶节点为NULL
。 问题是我要求程序在找到叶子的NULL
值时创建一个新节点。 因此,如果从不存在任何NULL
值,那么将永远不会创建任何新的叶子,对吗?
我遇到的另一个问题是我的compare(...)
函数。 在调试器中单步执行它会显示它多次遍历该函数,而从未实际返回任何值。 当返回到调用函数时,它将放回到compare(...)
函数中并无限循环。 同样,我不知道为什么会这样,考虑到每个if
语句中都有有效的return语句。
这是您可能需要的所有代码。 如果我遗漏了一些内容,请告诉我,我将其发布。
struct Node {
TYPE val;
struct Node *left;
struct Node *right;
};
struct BSTree {
struct Node *root;
int cnt;
};
struct data {
int number;
char *name;
};
int compare(TYPE left, TYPE right)
{
assert(left != 0);
assert(right != 0);
struct data *leftData = (struct data *) left;
struct data *rightData = (struct data *) right;
if (leftData->number < rightData->number) {
return -1;
}
if (leftData->number > rightData->number) {
return 1;
} else return 0;
}
void addBSTree(struct BSTree *tree, TYPE val)
{
tree->root = _addNode(tree->root, val);
tree->cnt++;
}
struct Node *_addNode(struct Node *cur, TYPE val)
{
assert(val != 0);
if(cur == NULL) {
struct Node * newNode = malloc(sizeof(struct Node));
newNode->val = val;
return newNode;
}
if (compare(val, cur->val) == -1) {
//(val < cur->val)
cur->left = _addNode(cur->left, val);
} else cur->right = _addNode(cur->right, val);
return cur;
}
编辑:添加以下功能
int main(int argc, char *argv[])
{
struct BSTree *tree = newBSTree();
/*Create value of the type of data that you want to store*/
struct data myData1;
struct data myData2;
struct data myData3;
struct data myData4;
myData1.number = 5;
myData1.name = "rooty";
myData2.number = 1;
myData2.name = "lefty";
myData3.number = 10;
myData3.name = "righty";
myData4.number = 3;
myData4.name = "righty";
/*add the values to BST*/
addBSTree(tree, &myData1);
addBSTree(tree, &myData2);
addBSTree(tree, &myData3);
addBSTree(tree, &myData4);
/*Print the entire tree*/
printTree(tree);
/*(( 1 ( 3 ) ) 5 ( 10 ))*/
return 1;
}
也许您可以尝试在malloc
之后将right和left分别设置为NULL
:
struct Node * newNode = malloc(sizeof(struct Node));
newNode->left = NULL;
newNode->right = NULL;
在此处检查此行(或左侧的对应行):
cur-> right = _addNode(cur-> right,val);
如果cur-> right == 0,就可以了。
但是如果cur-> right!= 0,则位于该节点的节点将被_addNode的返回值替换,该返回值最终不是一个完整的分支,而仅仅是一个节点。
我想使用memset(newNode,0,sizeof(struct Node))在malloc之后显式地将结构中的值输出0。 其他人可能会不同意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.