回复 9楼 renkejun1942
我以为你是写给自己以后看(甚至于使用)的。。。φ(゜▽゜*)♪
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> struct node { int value; struct node* left; struct node* right; }; typedef struct node NODE; typedef struct node* PNODE; void menu(); //菜单 int my_scanf(); //输入函数 void new_node(PNODE* n,int value); //创造一个新节点 void free_node(PNODE* n); //释放节点 void free_tree(PNODE* n); //释放二叉树 PNODE find_node(PNODE n,int value); //查找节点 void insert_node(PNODE* n,int value); //插入节点 int get_max_depth(PNODE n); //最长位置 int get_min_depth(PNODE n); //最短位置 int get_num_nodes(PNODE n); //获取节点数目 int get_min_value(PNODE n); //最短路径长度 int get_max_value(PNODE n); //最长路径长度 void deletenode(PNODE* n); //删除节点 void delete_node(PNODE* n,int value); void pre_order_traversal(PNODE n); //前序遍历 void in_order_traversal(PNODE n); //中序遍历 void post_order_traversal(PNODE n); //后序遍历 int main() { int option=0; PNODE tree=NULL; PNODE node=NULL; while (1) { system("cls"); menu(); option=my_scanf(); puts("---------------------------------"); if (option<0||option>11) { fprintf(stderr,"invalid option\n"); system("pause"); continue ; } switch (option) { case 0: exit(0); case 1: printf("Enter number to inserrt:"); option=my_scanf(); puts("\n"); insert_node(&tree,option); break; case 2: printf("Enter number to delete:"); option=my_scanf(); puts("\n"); delete_node(&tree,option); break; case 3: printf("Enter number to find"); option=my_scanf(); puts("\n"); node=find_node(tree,option); if (node!=NULL) puts("Found node\n"); else puts("Couldn't find node\n"); break; case 4: puts("Pre order traversal:"); pre_order_traversal(tree); puts("\n"); break; default : break; case 5: puts("In order traversal:"); in_order_traversal(tree); puts("\n"); break; case 6: puts("Post order traversal:"); post_order_traversal(tree); puts("\n"); break; case 7: printf("Max depth is %i\n\n",get_max_depth(tree)); break; case 8: printf("Min depth is %i\n\n", get_min_depth(tree)); break; case 9: printf("Max value is %i\n\n",get_max_value(tree)); break; case 10: printf("Min value is %i\n\n",get_min_value(tree)); break; case 11: printf("Node Count is %i\n\n",get_num_nodes(tree)); break; } system("pause"); } return 0; } void menu() { puts("---------------------------------"); puts("0 Exit"); puts("1 Insert node"); puts("2 Delete node"); puts("3 Find node"); puts("4 Pre order traversal"); puts("5 In order traversal"); puts("6 Post order traversal"); puts("7 Max depth"); puts("8 Min depth"); puts("9 Max value"); puts("10 Min value"); puts("11 Node Count\n"); puts("---------------------------------"); printf("Select an option:"); } int my_scanf() { char buf[50]={0}; int option=0; fgets(buf,sizeof (buf),stdin); sscanf(buf,"%i",&option); return option; } 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; } void free_tree(PNODE* n) //释放二叉树 { if (*n==NULL) return ; if ((*n)->left!=NULL) free_tree(&(*n)->left); //进行递归释放左节点 if ((*n)->right!=NULL) free_tree(&(*n)->right); //进行递归释放右节点 free_node(n); //释放节点 *n=NULL; } PNODE find_node(PNODE n,int value) //查找节点 { if (n==NULL) //如果节点为空则返回 return NULL; if (n->value==value) //如果找到数据,则返回该数据的指针 return n; if (value<=n->value) return find_node(n->left,value); 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); } int get_max_depth(PNODE n) //最长位置 { int left=0; int right=0; if (n==NULL) return 0; if (n->left!=NULL) left=get_max_depth(n->left)+1; if (n->right!=NULL) right=get_max_depth(n->right)+1; return (left>right?left:right); } int get_min_depth(PNODE n) //最短位置 { int left=0; int right=0; if (n==NULL) return 0; if (n->left!=NULL) left=get_min_depth(n->left)+1; if (n->right!=NULL) right=get_min_depth(n->right)+1; return (left<right?left:right); } 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 get_min_value(PNODE n) //最短路径长度 { if (n==NULL) return 0; if (n->left==NULL) return n->value; return get_min_value(n->left); } int get_max_value(PNODE n) //最大路径长度 { if (n==NULL) return 0; if (n->right==NULL) return n->value; return get_max_value(n->right); } 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; tmp=(*n); *n=(*n)->right; free_node(&tmp); } } void delete_node(PNODE* n,int value) { PNODE node=NULL; 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); } }
/*545 407 58 10 86 374 90 96 312 423 458 905 732 661 572 648 757 784 936 942 删除的值为545 905 732 661 572 407 58 10 86 374 90 96 312 423 458 648 757 784 936 942 删除的值为905 936 732 661 572 407 58 10 86 374 90 96 312 423 458 648 757 784 942 删除的值为407 936 732 661 572 423 58 10 86 374 90 96 312 458 648 757 784 942 删除的值为58 936 732 661 572 423 86 10 374 90 96 312 458 648 757 784 942 删除的值为86 936 732 661 572 423 374 90 10 96 312 458 648 757 784 942 删除的值为374 936 732 661 572 423 458 648 757 784 942 删除的值为732 936 757 661 572 423 458 648 784 942 删除的值为757 936 784 661 572 423 458 648 942 删除的值为784 936 942 删除的值为423 936 942 删除的值为661 936 942 删除的值为90 936 942 删除的值为10 936 942 删除的值为96 936 942 删除的值为572 936 942 删除的值为458 936 942 删除的值为936 删除的值为312 删除的值为648 删除的值为942 */
[此贴子已经被作者于2017-5-10 13:30编辑过]
389 19 343 181 312 252 304 387 497 490 413 825 807 632 617 759 662 804 843 966 删除的值为389//删除389之后,19的位置后移了,并且413丢失了。 //为什么会这样,我还没弄清楚。所以……你最好来解释一下你的代码的思路。 //那段代码发在下面。 497 490 413 19 343 181 312 252 304 387 825 807 632 617 759 662 804 843 966 删除的值为19//这里挺好理解的,当删除19之后,整个19作为根节点的树,都不见了。 497 490 413 825 807 632 617 759 662 804 843 966 删除的值为497 825 807 632 617 490 413 759 662 804 843 966 删除的值为825 843 807 632 617 490 413 759 662 804 966 删除的值为807 843 966
else { for( tmp = ( *n )->right; tmp->left != NULL; tmp = tmp->left ) ; tmp->left = ( *n )->left; tmp =( *n ); *n = ( *n )->right; free_node( &tmp ); }
[此贴子已经被作者于2017-5-10 18:51编辑过]