我正在尝试使用递归插入函数创建二叉树,但我的根节点似乎在不断变化(如果没有,printf应始终在下面的代码中提供相同的输出)。有关如何解决此问题的任何想法?
typedef struct Tnode{
char name[30];
int value;
struct Tnode *left;
struct Tnode *right;
} Tnode;
Tnode *insert(Tnode *node, char *name, int value){
if(node==NULL){
Tnode *temp = malloc(sizeof(struct Tnode));
sprintf(temp->name,"%s",name);
temp->value = value;
temp->left = NULL;
temp->right = NULL;
return temp;
}
else if(strcmp(name,node->name)<0)
{
node->left = insert(node->left, name, value);
}
else if(strcmp(name,node->name)>0)
{
node->right = insert(node->right, name, value);
}
else{
printf("something went wrong\n");
}
}
int main(){
Tnode *root = NULL;
root = insert(root,"george",11);
root = insert(root,"dick",12);
printf("%s\n",root->name);
root = insert(root,"walter",13);
root = insert(root,"harry",13);
printf("%s\n",root->name);
root = insert(root,"zink",40);
printf("%s\n",root->name);
}
答案 0 :(得分:0)
insert()
被声明为
Tnode *insert(...)
所以它总是需要返回一个指向Tnode的指针,但是你的if子句中有一些情况会导致执行分支不返回任何内容。我想这是未定义的返回值。
因为insert()通过传递调用来递归操作“如果你是一个叶子,把值放在这里并自己返回”,你需要处理这个案例“如果你不是,那么...... 并返回...... “。因此,假设您已经有一个大树并且插入了一个值,则根将调用传递给二进制结构,直到找到正确的位置。最后一次调用(递归结束的地方)将返回一个* Tnode到该叶子,以便前一个调用可以正确设置node->left = insert(...);
,但仍然需要堆栈上的“开放”调用(因为它是一个递归)关闭,即函数终止,每个节点都写入node->left
或node->right
。如果您没有返回任何内容,可能会有一些任意值会破坏您的数据结构并导致未定义的行为。
因此,解决方案只是在末尾添加return node;
,以便通过在根和新叶之间保持“传递”节点不变来最终确定递归调用。