代码包含二叉搜索树的结构。当我从bstNode结构中删除元素 - checkLeft或checkRight或者不在createTree方法中的这些变量中存储任何值时,它可以正常工作
我想在所有三个变量数据中存储值,checkLeft和checkRight。怎么解决这个问题。代码可以在http://ideone.com/geIfLk
找到 #include <stdio.h>
struct bstNode
{
int data;
struct bstNode *right, *left;
int checkLeft, checkRight;
};
void addBSTNode(struct bstNode *temp, struct bstNode **root)
{
if(*root == NULL)
{
*root = temp;
return;
}
struct bstNode *current = *root;
while(1)
{
if(temp->data > current->data && current->right != NULL)
current = current->right;
else if(temp->data < current->data && current->left != NULL)
current = current->left;
else
break;
}
if(temp->data > current->data)
current->right = temp;
else
current->left = temp;
}
struct bstNode* createTree(int dataArray[], int size)
{
struct bstNode *temp, *root = NULL;
int count = 0;
while(count < size)
{
temp = (struct bstNode*) malloc(sizeof(struct bstNode*));
temp->data = dataArray[count++];
temp->checkLeft = 0;
temp->checkRight = 0;
temp->right = NULL;
temp->left = NULL;
addBSTNode(temp, &root);
}
return root;
}
int main(void)
{
int dataArray[] = {4,1,3,2,5,8,7,6,9};
struct bstNode *root = createTree(dataArray, 9);
return 0;
}
答案 0 :(得分:2)
在你的行
temp = (struct bstNode*) malloc(sizeof(struct bstNode*));
为bstNode指针而不是整个struct分配内存。你想要的是分配整个结构,malloc(sizeof(struct bstNode));
这也解释了当你删除结构的一些成员时它的工作原理。在某些时候,bstNode
和bstNode*
的大小相同,或者至少不会导致立即错误。
有关已编辑的示例,请参阅here。
答案 1 :(得分:0)
addBSTNode
如果tmp->data
既不高于current->data
又低于NULL
且左右指针都不是while
,会发生什么?
执行流程离开if
循环并到达第二系列if
语句,这将在那里选择第二个tmp
:temp->data < current->data
将覆盖左侧指针,即使已经存在某些东西。
一个简单的解决方法是将temp->data <= current->data
替换为{{1}},以便在断开while循环之前搜索将有效地到达一个叶子。