树的应用,求代码,建立一个二叉排序树,具体要求如下,真心求解各位,时间紧迫。

2025-05-12 03:58:48
推荐回答(1个)
回答1:

这个做起来可真要花的时间,二叉排序树其实我也研究了一段时间,感觉比较难,我在网上找了一段代码。你自己去研究一下吧,要学习,还是自己动手比较好:
#include
#include
#include
struct node {
int value;
struct node* left;
struct node* right;
};
typedef struct node NODE;
typedef struct node* PNODE;
PNODE creat( PNODE tree,PNODE r,int value)
{
if(!r)
{
r = (PNODE)malloc(sizeof(NODE));
if(!r)
{
printf("内存分配失败!");
exit(0);
}

r->left = NULL;
r->right = NULL;
r->value = value;
if(!tree)
return r;
if(valuevalue)
tree->left = r;
else
tree->right = r;
return r;
}

if(value < r->value)
creat(r,r->left,value);
else
creat(r,r->right,value);
return tree;
}
void new_node (PNODE* n, int value)
{
*n = (PNODE)malloc (sizeof(NODE));
if (*n != NULL)
{
(*n)->value = value;
(*n)->left = NULL;
(*n)->right = NULL;
}
}
void free_node (PNODE* n)
{
if ((*n) != NULL)
{
free (*n);
*n = NULL;
}
} /* 查找结点 */

PNODE find_node (PNODE n, int value)
{
if (n == NULL)
{
return NULL;
}
else if (n->value == value)
{
return n;
}
else if (value <= n->value)
{
return find_node (n->left, value);
}
else
{
return find_node (n->right, value);
}
} /* 插入结点 */
void insert_node (PNODE* n, int value)
{
if (*n == NULL)
{
new_node (n, value);
}
else if (value == (*n)->value)
{
return;
}
else if (value < (*n)->value)
{
insert_node (&((*n)->left), value);
}
else
{
insert_node (&((*n)->right), value);
}
} /* 删除结点 */
void deletenode (PNODE *n)
{
PNODE tmp = NULL;

if (n == NULL)
return;

if ((*n)->right == NULL)
{
tmp = *n;
*n = (*n)->left;
free_node (n);
}
else if ((*n)->left == NULL)
{
tmp = *n;
*n = (*n)->right;
free_node (n);
}
else
{
for (tmp = (*n)->right; tmp->left != NULL; tmp = tmp->left);
tmp->left = (*n)->left;
mp = (*n);
*n = (*n)->right;
free_node (&tmp);
}
}
void delete_node (PNODE *n, int value)
{
PNODE node;
if (n == NULL)
return;

node = find_node (*n, value);

if ((*n)->value == value)
{
deletenode (n);
}
else if (value < (*n)->value)
{
delete_node (&((*n)->left), value);
}
else
{
delete_node(&((*n)->right), value);
}
}
void pre_order_traversal(PNODE n) /* 前序遍历 */
{
if (n != NULL)
{
printf ("%i ", n->value);
pre_order_traversal (n->left);
pre_order_traversal( n->right);
}
}
void in_order_traversal (PNODE n) /* 中序遍历 */
{
if (n != NULL)
{
in_order_traversal (n->left);
printf ("%i ", n->value);
in_order_traversal ( n->right);
}
}
void post_order_traversal (PNODE n) /* 后序遍历 */
{
if (n != NULL)
{
post_order_traversal (n->left);
post_order_traversal (n->right);
printf ("%i ", n->value);
}
}
int get_num_nodes (PNODE n) /* 计算树的节点数 */
{
int left = 0;
int right = 0;
if (n == NULL)
{
return 0;
}
if (n->left != NULL)
{
left = get_num_nodes (n->left);
}
if (n->right != NULL)
{
right = get_num_nodes (n->right);
}
return (left + 1 + right);
}
int main()
{
char buf[50];
int i,n,option,s[80];
PNODE tree = NULL;/*树的第一个结点*/
PNODE node = NULL;
while (1)
{
printf ("--------------------------\n");
printf ("Options are:\n\n");
printf (" 0 Creat tree\n");
printf (" 1 Insert node\n");
printf (" 2 Delete node\n");
printf (" 3 Find node\n");
printf (" 4 Pre order traversal\n"); /* 前序遍历 */
printf (" 5 In order traversal\n"); /* 中序遍历 */
printf (" 6 Post order traversal\n");/* 后序遍历 */
printf (" 7 Node Count\n");
printf (" 8 Exit\n\n");
printf ("--------------------------\n");
printf ("Select an option: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("--------------------------\n");
if (option < 0 || option > 12)
{
fprintf (stderr, "Invalid option");
continue;
}
switch (option)
{
case 0:
printf ("Enter number of elements of array: ");
scanf("%d",&n);
printf ("Enter %d elements of array:\n",n);
for(i=0;i {
scanf("%d",&s[i]);
tree = creat(tree,tree,s[i]);
}
fflush(stdin);
break;
case 1:
printf ("Enter number to insert: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
insert_node (&tree, option);
break;
case 2:
printf ("Enter number to delete: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
delete_node (&tree, option);
break;
case 3:
printf ("Enter number to find: ");
fgets (buf, sizeof(buf), stdin);
sscanf (buf, "%i", &option);
printf ("\n\n");
node = find_node (tree, option);
if (node != NULL)
{
printf ("Found node\n\n");
}
else
{
printf ("There is no node which you input!\n\n");
}
break;
case 4:
printf ("Pre order traversal: ");
pre_order_traversal (tree);
printf ("\n\n");
break;
case 5:
printf ("In order traversal: ");
in_order_traversal (tree);
printf ("\n\n");
break;
case 6:
printf ("Post order traversal: ");
post_order_traversal (tree);
printf ("\n\n");
break;
case 7:
printf ("Node Count is %i\n\n", get_num_nodes (tree));
break;
case 8:
exit (0);
}
}
return 0;
}