我似乎遇到了一个问题,当我将值分配到二进制搜索树时,根将接收输入的第一个值,但之后就不输入其他值了。如果我直接查看root->left或root->right,它只返回null。我盯着这个看了太久了,简直不知所措。我确信我的递归确实有一些基本的错误,但我就是看不出来。我真的很感激任何帮助,看看我在哪里出错了。
#include <stdio.h>
#include <stdlib.h>
#include "Bst.h"
int main(int argc, char** argv) {
int value;
TreeNode* root = NULL;
printf ("Enter an integern");
scanf ("%d", &value);
while (value > 0) {
root = insert (value, root);
printf ("Enter an integern");
scanf ("%d", &value);
}
printf("The inorder traversal of the treen");
inOrder(root);
printf("n");
printf("The preorder traversal of the treen");
preOrder(root);
printf("n");
return (EXIT_SUCCESS);
}
TreeNode* insert(int newValue, TreeNode* root) {
TreeNode* temp = NULL;
//Sets a value to the root
if (root == NULL) {
temp = (TreeNode*)malloc(sizeof(TreeNode));
temp -> value = newValue;
temp -> left = NULL;
temp -> right = NULL;
return temp;
}
//Will put a larger value to the right within the tree
else if (newValue > (root -> value)) {
temp = insert(newValue, (root -> right));
}
//Will put a smaller value to the left
else {
temp = insert (newValue, (root -> left));
}
return root;
}
void inOrder(TreeNode* root){
if(root == NULL){
return;
}
else {
inOrder(root -> left);
printf("%d", root -> value);
printf(" ");
inOrder(root -> right);
}
return;
}
void preOrder(TreeNode* root){
if(root == NULL) {
return;
} else {
preOrder(root -> right);
printf("%d", root -> value);
printf(" ");
preOrder(root -> left);
}
return;
}
更改:
temp = insert(newValue, (root -> right));
至
root->right = insert(newValue, (root -> right));
也以相同的方式更改左侧版本。现在您正在分配子节点,但从未将它们分配给右指针或左指针。他们基本上被抛弃了。
可以肯定的是,错误是将新插入的右节点和左节点分配给temp
,而不是root->right
和root->left
,这会使它们在树外悬空。
更改这些行:
//Will put a larger value to the right within the tree
else if (newValue > (root -> value)){
temp = insert(newValue, (root -> right));
}
//Will put a smaller value to the left
else{
temp = insert (newValue, (root -> left));
}
对此:
//Will put a larger value to the right within the tree
else if (newValue > (root -> value)) {
root->right = insert(newValue, (root -> right));
}
//Will put a smaller value to the left
else {
root->left = insert (newValue, (root -> left));
}
此更改使您的代码在我测试时能够按预期工作;inOrder和preOrder都给出了正确的结果。
请参阅此Ideone示例