二叉树操作系统(二叉排序树)头文件部分: #define INF 0xffffff void Insert_BTree(BTree *root,DataType data) { BTree s; if(*root==NULL) //明白这样子写代码的思路吗 { s=(BTNode *)malloc(sizeof(BTNode)); //什么时候在非初始化函数形参内用二级指针或者引用类型 s->data=data; s->lchild=NULL; s->rchild=NULL; *root=s; } else if((*root)->data>data) Insert_BTree(&((*root)->lchild),data); else if((*root)->data<data) Insert_BTree(&((*root)->rchild),data); } int Search_BTree(BTree root,DataType data) //二叉排序树查找操作 { BTNode *p; p=root; while(p) { if(p->data==data) return p->data; if(p->data>data) p=p->lchild; else p=p->rchild; } return INF; } void Create_BTree(BTree *root) { int i,data,cnt; *root=NULL; printf("请输入二叉排序树节点的数目:\n"); scanf("%d",&cnt); printf("请输入各节点数据,相邻数据之间用空格隔开:\n"); for(i=1;i<=cnt;i++) { scanf("%d",&data); Insert_BTree(root,data); } } void Delete_BTree(BTree root,DataType data) { BTree p,father,sc,q; p=root; father=NULL; while(p) //匹配元素data或者p==NULL时跳出循环 { if(p->data==data) //匹配后p就是要被删除的节点 break; father=p; //father总是存放p的父亲节点 if(p->data>data) p=p->lchild; else if(p->data<data) p=p->rchild; } if(p==NULL) //开始分类讨论 { printf("元素不存在,删除失败!!!\n"); return ; } if(p->lchild==NULL) //删除与插入仍然要符合二叉排序树的性质 { if(father->lchild==p) father->lchild=p->rchild; else father->rchild=p->rchild; free(p); } else //p的左子树不为空 { //既然p左子树不为空,那我肯定是要找左子树的最大节点 q=p; //或者是右子树的最小节点,但是 sc=p->lchild; while(sc->rchild) //这种方式直到sc为叶子节点或者只有左子树的节点 { //最终sc就是p左子树的最大节点 q=sc; sc=sc->rchild; } if(q==p) //此时p节点的右子树为空 q->lchild=sc->lchild; else //此时p的左子树的右子树不为空, q->rchild=sc->lchild; //想想为什么是这样,因为这样才能维持二叉排序树的性质 p->data=sc->data; free(sc); } } void In_order_Rec_BST(BTree root) { if(root) { In_order_Rec_BST(root->lchild); printf("%d ",root->data); In_order_Rec_BST(root->rchild); } } void Fuction_BTree(BTree root) { int data,chioce,t; system("cls"); printf("\t 二叉排序树应用 \n"); printf("\t 1. 创建二叉 \n"); printf("\t 2. 搜索节点 \n"); printf("\t 3. 插入节点 \n"); printf("\t 4. 删除节点 \n"); printf("\t 0. 退出 \n"); printf("请输入相应操作: \n"); scanf("%d",&chioce); while(!(chioce>=0&&chioce<=4)) //输入序号不存在,操作出错 { printf("输入有问题,请重新输入:"); scanf("%d",&chioce); } while(chioce!=0) { //建立循环选择不同的操作 switch(chioce) { case 1: //选择操作1即二叉排序树的创建 printf("创建二叉树: \n"); Create_BTree(&root); In_order_Rec_BST(root); printf("\n"); break; case 2: //选择操作2即在二叉排序树中进行查找 printf("请输入你想搜索的节点存储元素信息: \n"); scanf("%d",&data); t=Search_BTree(root,data); if(t!=INF) { printf("查找成功: "); printf("%d\n",t); } else printf("关键字不存在\n"); break; case 3: //选择操作3即在二叉排序树中进行插入操作 printf("请输入你想插入的节点存储元素信息: \n"); scanf("%d",&data); Insert_BTree(&root,data); In_order_Rec_BST(root); printf("\n"); break; case 4: //选择操作4即在二叉排序树中进行删除操作 printf("请输入你想删除的节点存储信息: \n"); scanf("%d",&data); Delete_BTree(root,data); In_order_Rec_BST(root); printf("\n"); break; } printf("请继续进行相应操作:"); scanf("%d",&chioce); } return ; }
时间: 2024-10-18 17:46:01