C - 二叉树的实现在插入时导致奇怪的行为
C - Implementation of Binary Tree Causing Strange Behavior on Insert
我的二叉树设置如下:
`
我也是这样初始化BT的第一个节点:
`
到目前为止一切正常。但是,当我尝试插入我的 BT 时,我不断遇到意外行为。我的插入函数如下所示。
`
然而,当我 运行 主函数的代码并尝试插入 BT 时,第一个节点显示得很好,但第二个节点变成了一些大而奇怪的数字。当我在调试器中 运行 它时,它显示了我期望的数字,但这不是打印出来的数字。这是我的主要方法。
`
问题出在我的插入函数中,但我不确定出了什么问题,因为当我通过调试器 运行 它时,我得到了预期值 5 和 6。
在这些陈述中
struct Node* node1 = (struct Node*) malloc(sizeof(struct Node*));
^^^^^^^^^^^^
struct Node* node2 = (struct Node*) malloc(sizeof(struct Node*));
^^^^^^^^^^^^
您分配的内存不正确。而是写
struct Node* node1 = (struct Node*) malloc(sizeof(struct Node));
^^^^^^^^^^^
struct Node* node2 = (struct Node*) malloc(sizeof(struct Node));
^^^^^^^^^^^^
函数insert
也存在同样的问题。
也在函数内将return语句移动到函数的末尾
struct Node* insert(struct Node* rootPtr, struct Node* node) {
if (rootPtr == NULL) {
rootPtr = (struct Node*) malloc(sizeof(struct Node));
rootPtr->data = node->data;
rootPtr->left = NULL;
rootPtr->right = NULL;
}
if (rootPtr->data > node->data) {
rootPtr->left = insert(rootPtr->left, node);
} else if (rootPtr->data < node->data) {
rootPtr->right = insert(rootPtr->right, node);
}
return rootPtr;
}
注意将指向整个节点的指针作为第二个参数传递是低效且容易出错的。你可以只传递一个整数。所以函数应该声明为
struct Node* insert(struct Node* rootPtr, int data );
我的二叉树设置如下:
`
我也是这样初始化BT的第一个节点:
`
到目前为止一切正常。但是,当我尝试插入我的 BT 时,我不断遇到意外行为。我的插入函数如下所示。
`
然而,当我 运行 主函数的代码并尝试插入 BT 时,第一个节点显示得很好,但第二个节点变成了一些大而奇怪的数字。当我在调试器中 运行 它时,它显示了我期望的数字,但这不是打印出来的数字。这是我的主要方法。
`
问题出在我的插入函数中,但我不确定出了什么问题,因为当我通过调试器 运行 它时,我得到了预期值 5 和 6。
在这些陈述中
struct Node* node1 = (struct Node*) malloc(sizeof(struct Node*));
^^^^^^^^^^^^
struct Node* node2 = (struct Node*) malloc(sizeof(struct Node*));
^^^^^^^^^^^^
您分配的内存不正确。而是写
struct Node* node1 = (struct Node*) malloc(sizeof(struct Node));
^^^^^^^^^^^
struct Node* node2 = (struct Node*) malloc(sizeof(struct Node));
^^^^^^^^^^^^
函数insert
也存在同样的问题。
也在函数内将return语句移动到函数的末尾
struct Node* insert(struct Node* rootPtr, struct Node* node) {
if (rootPtr == NULL) {
rootPtr = (struct Node*) malloc(sizeof(struct Node));
rootPtr->data = node->data;
rootPtr->left = NULL;
rootPtr->right = NULL;
}
if (rootPtr->data > node->data) {
rootPtr->left = insert(rootPtr->left, node);
} else if (rootPtr->data < node->data) {
rootPtr->right = insert(rootPtr->right, node);
}
return rootPtr;
}
注意将指向整个节点的指针作为第二个参数传递是低效且容易出错的。你可以只传递一个整数。所以函数应该声明为
struct Node* insert(struct Node* rootPtr, int data );