createBinaryTree给出了无限循环,createBinarySearchTree给出了分割错误



createBinaryTree给出无限循环,createBinarySearchTree给出分割错误。 有人可以指导我,因为我对数据结构很陌生。

#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
} * NODE;
NODE createBinaryTree(NODE root)
{
NODE temp = (NODE)malloc(sizeof(struct node));
printf("Enter the value of the node. n Enter -1 for returning. n");
scanf(" %d", &temp->data);
if (temp->data == -1)
return NULL;
else
{
printf("For left Node of %d n", temp->data);
temp->lchild = createBinaryTree(temp->lchild);
printf("For right Node of %d n", temp->data);
temp->rchild = createBinaryTree(temp->rchild);
}
return temp;
}
NODE createBinarySearchTree(NODE root, int ele)
{
NODE new_node;
new_node = (NODE)malloc(sizeof(struct node));
new_node->data = ele;
new_node->lchild = new_node = NULL;
if (root == NULL)
return new_node;
NODE parent = NULL;
NODE curr = root;
while (curr != NULL)
{
parent = curr;
if (curr->data < ele)
curr = curr->rchild;
else
curr = curr->lchild;
}
if (ele < parent->data)
parent->lchild = new_node;
else
parent->rchild = new_node;
return root;
}
void inorder(NODE ptr)
{
if (ptr != NULL)
{
inorder(ptr->lchild);
printf("%5d", ptr->data);
inorder(ptr->rchild);
}
}
void postorder(NODE ptr)
{
if (ptr != NULL)
{
postorder(ptr->lchild);
postorder(ptr->rchild);
printf("%5d", ptr->data);
}
}
void preorder(NODE ptr)
{
if (ptr != NULL)
{
printf("%5d", ptr->data);
preorder(ptr->lchild);
preorder(ptr->rchild);
}
}
void main()
{
NODE root = NULL;
printf("Enter 0.createBinaryTree n");
printf("Enter 1.createBinarySearchTree n");
printf("Enter 2.displayTree n");
printf("Enter 3.searchTree n");
int choice;
printf("Enter your choicen");
scanf(" %d", &choice);
int tempvalue;
while (1)
{
switch (choice)
{
case 0:
root = createBinaryTree(root);
break;
case 1:
printf("Enter Root Noden");
scanf(" %d", &tempvalue);
while (tempvalue != -1)
{
root = createBinarySearchTree(root, tempvalue);
break;
printf("Enter Next Node.n Enter -1 to exitn");
scanf(" %d", &tempvalue);
}
break;
case 2:
printf("n Inorder Traversals n");
inorder(root);
printf("n Postorder Traversals n");
postorder(root);
printf("n Preorder Traversals n");
preorder(root);
printf("n ********* n");
break;
case 4:
exit(0);
}
}
}

用于 BinarySearchTree。在第一次迭代中,在每次迭代中将新节点设置为 NULL。最好先检查节点的值,然后决定遍历树的方向。当您点击根目录时,请添加节点。如下所示。

单独输入根,以便您可以比较下一个输入。

case 1:
printf("Enter Root Noden");
scanf(" %d", &tempvalue);
NODE root;
root = (NODE)malloc(sizeof(struct node));
root->data = tempvalue;
while (tempvalue != -1)
{   
printf("Enter Node Valuen");
scanf(" %d", &value);
if(value == -1){
break;
}
root = createBinarySearchTree(root, value);
}
return 0;

然后在函数内部,遍历树,直到找到节点应该去哪里。

NODE createBinarySearchTree(NODE root, int ele)
{
NODE new_node;
new_node = (NODE)malloc(sizeof(struct node));
new_node->data = ele;
if (root == NULL)
return new_node;
NODE curr = root;
while (curr != NULL)
{
printf("%dn",curr->data);
if(ele < curr->data )
{
if(curr->lchild == NULL){
printf("inserted %d as left child of %dn",ele,curr->data );
curr->lchild = new_node;
return root;
}
curr=curr->lchild;
}
else if(ele > curr->data)
{
if(curr->rchild == NULL){
printf("inserted %d as right child child of %dn",ele,curr->data );
curr->rchild = new_node;
return root;
}
curr=curr->rchild;
}
}
return root;
}

对于您的 createBinaryTree 函数

问题出在行扫描("%d", &temp->data(;当你到达树的根时,你然后在根上方的节点上再次调用创建二叉树,然后覆盖你之前的条目。要解决此问题,您应该在将scanf的值分配给临时>数据之前检查其值。此外,如果根是在之前的迭代中设置的,则您需要返回 root,而不是在 -1 上返回 NULL。如下所示。

编辑

typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
} * NODE;
NODE createBinaryTree(NODE root)
{
printf("Enter the value of the node. n Enter -1 for returning. n");
int input = 0; 
scanf(" %d", &input);
printf("%dn",input );
if(input == -1 && root == NULL){
return NULL;
}
if(input == -1 && root != NULL){
return root;
}
NODE temp = (NODE)malloc(sizeof(struct node));
temp->data = input;
if (temp->data == -1)
return NULL;
else
{
printf("For left Node of %d n", temp->data);
temp->lchild = createBinaryTree(temp->lchild);
printf("For right Node of %d n", temp->data);
temp->rchild = createBinaryTree(temp->rchild);
}
return temp;
}
NODE createBinarySearchTree(NODE root, int ele)
{
NODE new_node;
new_node = (NODE)malloc(sizeof(struct node));
new_node->data = ele;
new_node->lchild = new_node;
if (root == NULL)
return new_node;
NODE parent = NULL;
NODE curr = root;
while (curr != NULL)
{
parent = curr;
if (curr->data < ele)
curr = curr->rchild;
else
curr = curr->lchild;
}
if (ele < parent->data)
parent->lchild = new_node;
else
parent->rchild = new_node;
return root;
}
void inorder(NODE ptr)
{
if (ptr != NULL)
{
inorder(ptr->lchild);
printf("%5d", ptr->data);
inorder(ptr->rchild);
}
}
void postorder(NODE ptr)
{
if (ptr != NULL)
{
postorder(ptr->lchild);
postorder(ptr->rchild);
printf("%5d", ptr->data);
}
}
void preorder(NODE ptr)
{
if (ptr != NULL)
{
printf("%5d", ptr->data);
preorder(ptr->lchild);
preorder(ptr->rchild);
}
}
int main()
{
NODE root = NULL;
printf("Enter 0.createBinaryTree n");
printf("Enter 1.createBinarySearchTree n");
printf("Enter 2.displayTree n");
printf("Enter 3.searchTree n");
int choice;
printf("Enter your choicen");
scanf(" %d", &choice);
int tempvalue;
while (1)
{
switch (choice)
{
case 0:
root = createBinaryTree(root);
printf("Donen");
return 0;
case 1:
printf("Enter Root Noden");
scanf(" %d", &tempvalue);
while (tempvalue != -1)
{
root = createBinarySearchTree(root, tempvalue);
break;
printf("Enter Next Node.n Enter -1 to exitn");
scanf(" %d", &tempvalue);
}
return 0;
case 2:
printf("n Inorder Traversals n");
inorder(root);
printf("n Postorder Traversals n");
postorder(root);
printf("n Preorder Traversals n");
preorder(root);
printf("n ********* n");
return 0;
case 4:
exit(0);
}
}
return 0;
}

最新更新