二叉排序树——完整代码实现
来源:互联网 发布:win8如何更改网络类型 编辑:程序博客网 时间:2024/06/06 13:45
二叉排序树,又称二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树。
(1) 若他的左子树不为空,则左子树上所有结点的值均小于他的根结点的值。
(2) 若他的右子树不为空,则右子树上所有结点的值均大于他的根结点的值。
(3) 他的左右子树也分别是二叉排序树。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;bool SearchBST(BiTree T,int key,BiTree f,BiTree *p){ if(!T)//查找不成功 { *p=f; return false; } else if(key==T->data)//查找成功 { *p=T; return true; } else if(key<T->data)//查找左子树 return SearchBST(T->lchild,key,T,p); else//查找右子树 return SearchBST(T->rchild,key,T,p);}bool InsertBST(BiTree *T,int key){ BiTree p,s; if(!SearchBST(*T,key,NULL,&p)) { s=(BiTree)malloc(sizeof(BiTNode)); s->data=key; s->lchild=s->rchild=NULL; if(!p)//该树为空树,s为根节点 *T=s; else if(key<p->data) p->lchild=s;//s为左孩子 else p->rchild=s;//s为右孩子 return true; } return false; //已存在该节点}/*从二叉排序树中删除节点p,并重新接上他的左、右子树*/bool Delete(BiTree *p){ BiTree q,s; if((*p)->rchild==NULL)//右子树为空,只需要重接他的左子树 { q=*p; *p=(*p)->lchild; free(q); } else if((*p)->lchild==NULL)//左子树为空,只需要重接他的右子树 { q=*p; *p=(*p)->rchild; free(q); } else//左右子树均不为空 { q=*p; s=(*p)->lchild; while(s->rchild)//转左,然后向右走到尽头,找p的前驱。 { q=s; s=s->rchild; } (*p)->data=s->data;//s指向被删结点的直接前驱,然后用s来替换p if(q!=*p)//如果p,q指向不同的结点,则表明s结点下面还有右子树。 q->rchild=s->lchild;//重接q的右子树。 else q->lchild=s->lchild;//重接q的左子树。 free(s); } return true;}bool DeleteBST(BiTree *T,int key){ if(!*T)//查找不成功 { return false; } else if(key==(*T)->data)//查找成功 { return Delete(T); } else if(key<(*T)->data)//查找左子树 return DeleteBST(&(*T)->lchild,key); else//查找右子树 return DeleteBST(&(*T)->rchild,key);}void InOrderTraverse(BiTree T)//中序遍历{ if(T==NULL) return; InOrderTraverse(T->lchild); printf("%d ",T->data); InOrderTraverse(T->rchild);}int main(){ int a[]={62,88,58,47,35,73,51,99,37,93}; BiTree T=NULL; for(int i=0;i<10;i++) InsertBST(&T,a[i]); InOrderTraverse(T); cout<<endl; cout<<"请输入要插入的数据"<<endl; int key; cin>>key; if(InsertBST(&T,key)) { cout<<"插入成功"<<endl; InOrderTraverse(T); cout<<endl; } else cout<<"插入失败"<<endl; cout<<"请输入要删除的数据"<<endl; cin>>key; if(DeleteBST(&T,key)) { cout<<"删除成功"<<endl; InOrderTraverse(T); cout<<endl; } else cout<<"删除失败"<<endl; return 0;}
阅读全文
0 0
- 二叉排序树——完整代码实现
- 二叉排序树的完整实现
- 二叉排序树的构造,插入,删除,完整c代码实现
- 二叉排序树代码实现
- java代码实现二叉排序树
- 二叉排序树java代码实现
- 二叉排序树的基本操作(完整代码)
- 二叉排序树C实现(含完整源码)
- 二叉排序树C实现(含完整源码)
- 二叉排序树C实现(含完整源码)
- 去除代码中的注释——完整实现代码
- 二叉排序树的C++实现代码
- 二叉排序树概念及代码实现
- 有关二叉排序树的代码实现
- BST二叉排序树的查找和删除的完整C代码
- 二叉排序树的实现——java
- 二叉排序树——理解与实现
- 大整数类C++实现——完整代码
- SpringBoot(二):配置文件详解
- CF_Educational Codeforces Round 28_A
- CodeForces 121A
- 欢迎使用CSDN-markdown编辑器
- TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
- 二叉排序树——完整代码实现
- 2016ACM-ICPC广西邀请赛(三题)
- ubuntn系统上搜狗输入法崩溃,只能输入英文字母,无法出入汉字
- 奋斗群群赛4总结与心得
- 做到这些_才算是顶级程序员
- Java参数传递小结
- 使用express搭建了框架后,用multer处理post请求传的文件或图片注意的问题
- 分页插件(二)
- Feign的使用