二叉搜索树操作~
失眠~敲代码~程序代码:
#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)); 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); } }