好吧,我试图从给定的输入创建一个不平衡的二进制搜索树作为一个(未排序的)整数序列。
我的方法是递归地为每个单独节点找到正确的位置,然后为它分配内存并为其定义数据。
但是我无法有效地调试程序,因为尽管已经正确地审查了它,我似乎无法确定问题。
输入如下:
所以对于输入:
11
15 6 4 8 5 3 1 10 13 2 11
预期输出应该是后序和有序遍历,但奇怪的是没有任何内容被打印出来(除了我之间给出的换行符)。
的更新
1. [2015年3月20日] - 考虑到警告,取消了malloc类型
2. [2015年3月21日]进行了一些更改,但现在,代码只提供以下输出:
11 13
11 13
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define arrmax 100
/***Pointer-based BST implementation, developed by Abhineet Saxena***/
/***The data-type declaration***/
typedef struct node{
int data;
struct node* parent;
struct node* leftChild;
struct node* rightChild;
}Node;
typedef struct tree
{
Node* root;
int size;
}BSTree;
/***Method prototypes***/
/*Method to create a tree*/
Node* createTree(int[],int,int);
//Changed from void to Node*: void createNode(Node*,int);
Node* createNode(Node*,int);
void inOrder(Node* root);
void postOrder(Node *root);
int main(void) {
BSTree* bs_tree;
//Incorrect here: bs_tree=(BSTree*)malloc(sizeof(BSTree));
bs_tree=malloc(sizeof(BSTree));
bs_tree->root=NULL;
bs_tree->size=0;
/****Taking the input****/
int num_elem,iterv;
scanf("%d\n",&num_elem);
//Incorrect here: int *arr=(int*)malloc(sizeof(int)*(num_elem));
int *arr=malloc(sizeof(int)*(num_elem));
for(iterv=0;iterv<num_elem;iterv++)
{
scanf("%d",&arr[iterv]);
}
bs_tree->root=createTree(arr,0,num_elem-1);
postOrder(bs_tree->root);
printf("\n");
inOrder(bs_tree->root);
return 0;
}
Node* createTree(int marr[],int left,int right)
{
int iterv;
Node* root;
root=NULL;
for(iterv=left;iterv<=right;iterv++)
{
//Made changes here: Old:-createNode(root,marr[iterv]);
root=createNode(root,marr[iterv]);
}
return root;
}
Node* createNode(Node* root,int key)
{
if(root==NULL)
{
root=malloc(sizeof(Node));
//printf("Used malloc here for key: %d\n",key);
root->data=key;
root->leftChild=NULL;
root->rightChild=NULL;
root->parent=NULL;
//Changed here: [old]return;
return root;
}
else
{
if(key<root->data)
{
//Added code here[Old: createNode(root->leftChild,key);]
if(root->leftChild!=NULL)
createNode(root->leftChild,key);
else
{
root->leftChild=createNode(root->leftChild,key);
return root;
}
}
else
//Added Code here: [old codeline:-] createNode(root->rightChild,key);
{
if(root->rightChild!=NULL)
createNode(root->rightChild,key);
else
{
root->rightChild=createNode(root->rightChild,key);
return root;
}
}
}
}
void inOrder(Node* bst_tree)
{
if(bst_tree!=NULL)
{
inOrder(bst_tree->leftChild);
printf("%d ",bst_tree->data);
inOrder(bst_tree->rightChild);
}
else
return;
}
void postOrder(Node* bst_tree)
{
if(bst_tree!=NULL)
{
postOrder(bst_tree->leftChild);
postOrder(bst_tree->rightChild);
printf("%d ",bst_tree->data);
}
else
return;
}
答案 0 :(得分:1)
我认为,问题出在void createNode(Node* root,int key)
函数中。变量Node* root
是函数的本地变量。因此,更改不会反映在createNode()
之外。
仅供参考,C
使用pass-by-value传递函数参数。
所以,要么你要
return
来自root
的新分配的createNode()
并将其收集在来电者中。您还需要将createNode()
函数的返回类型更改为Node *
(或void *
,至少)。或
Node *
createNode()
的指针作为参数
醇>
重要提示:使用完毕后,始终free()
已分配的内存。否则,它会导致内存泄漏。
答案 1 :(得分:1)
您的createNode()
函数为节点分配内存并用数据填充它,但我看不到它将新节点链接到数据结构的其余部分。您的所有leftChild
和rightChild
指针以及树root
都保持为NULL。
所以你在堆上有很多节点某处但你的树是空的......
当您进入main()
bs_tree->root = createTree(arr,0,num_elem-1);
你也应该在createTree()
root = createNode(root,marr[iterv]);
并在createNode()
root->leftChild = createNode(root->leftChild,key);
root->rightChild = createNode(root->rightChild,key);
所有这些功能,当然还有return root;
。
修改强>
可能的实施:
Node* insertNode(Node* root, int value)
{
if(root == NULL)
{
root = malloc(sizeof(Node));
root->data = val;
root->leftChild = NULL;
root->rightChild = NULL;
}
else
if(val < root->data)
root->leftChild = insertNode(root->leftChild, val);
else
root->rightChild = insertNode(root->rightChild, val);
return root;
}
答案 2 :(得分:0)
这部分不正确:
void createNode(Node* root,int key)
{
...
root=(Node*)malloc(sizeof(Node));
...
}
root
是你的论点,改变它的价值(你在其中存储另一个地址)很少是个好主意。您必须使用指向该指针的指针:
void createNode(Node** root,int key)
{
...
*root = malloc(sizeof(Node));
...
}
或在结尾处返回新值:
Node* createNode(Node* root,int key)
{
...
root = malloc(sizeof(Node));
...
return root;
}