


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+模板实现的二叉排序(查找)树二叉排序树定义:二叉排序树是这样的树, 结点左边的值都小于结点的值,结点右边的值都大于结点的值,所以按照二叉树的中序遍历的话,得到的的将是按顺序排列的值。二叉排序树的主要操作:1:插入插入的操作非常简单,从根结点开始,如果插入值大于根节点值,则向右遍历,如果小于根节点值,则想左遍历,知道遇到一个叶子结点为止。按插入值大于叶子则将插入值作为叶子 结点的右孩子,否则左孩子。中间过程中如果遇到跟插入值相等的,则插入失败。2:删除关于有三种情况需要不同对待。<1>如果是叶子结点,那么直接删除就行(注意相关的孩子指针要变成NULL)。<2>如果要删
2、除的结点只有左孩子或者右孩子,这样也好办,我们只需要把相应的孩子赋值给待删除结点的双亲结点的孩子指针即可,孙子升级当儿子。<3>如果要删除的结点既有左孩子,又有右孩子,那么情况就稍微有点麻烦,在这里我们可以采取两种策略来实现,第一种是"前驱不动,移动右孩子法”,第二种是"右孩子不动,移动前驱法”。具体如下图所示:3:遍历遍历采用递归方法,遍历的实现就很简单了。4:清除在清除树的所有结点的时候,采取了递归思想,判断左孩子是否为空, 如果不空则清空做孩子;再判断右孩子是否为空,不为空则清空右孩子;只有当结点左右孩子结点都为空的时候, 才释放该结点的空间。5:查找查找
3、要利用二叉排序树的自身优点来进行,每次根据与结点的比较结果选择再继续跟左孩子比较还是跟右孩子比较。实现代码:/BSTrees.h#ifndef DDXX_BSTREES_H#define DDXX_BSTREES_H#include <iostream>using namespacestd; template<typename Type> classBSTreespublic:BSTrees();BSTrees();public:struct NodeType e;Node* leftChild;Node* rightChild; Node()Node(Type _e)
4、e = _e; leftChild = NULL; rightChild = NULL;public:bool insert(Type e);bool erase1(Type e);bool erase2(Type e);void clear();bool isEmpty();int getLength();Node* find(Type e);Node* getRoot();Node* getParent(Node* p); void traverse(Node* ptr);private:void clears(Node* &p);private:Node* m_root;int
5、m_Length;template<typename Type> BSTrees<Type>:BSTrees()m_root = NULL; m_Length = 0;template<typename Type> bool BSTrees<Type>:insert(Type e)Node* ptr = new Node(e);if ( ptr = NULL )cout<<"Allocate memory for the element failed" <<endl; return false;if(
6、m_root = NULL)m_root = ptr; m_Length+; return true;Node* p = m_root;Node* pParent = m_root;while( p != NULL)if( e = p->e)cout<<"the element is already exist"<<endl; return false;pParent = p;if( e > p->e)p = p->rightChild;elsep = p->leftChild;if( e < pParent-&g
7、t;e ) pParent->leftChild = ptr;if( e > pParent->e) pParent->rightChild = ptr;m_Length+; return true;template<typename Type> bool BSTrees<Type>:erase1(Type e) Node *p = find(e);if ( p = NULL ) cout<<"There's no this element to delete"<<endl; return fa
8、lse;if ( p->leftChild = NULL)Node* pParent = getParent(p);if( pParent->leftChild = p )pParent->leftChild = p->rightChild; elsepParent->rightChild = p->rightChild; delete p; p = NULL;m_Length-; return true;if ( p->rightChild = NULL)Node* pParent = getParent(p);if( pParent->lef
9、tChild = p)pParent->leftChild = p->leftChild;elsepParent->rightChild = p->leftChild;delete p; p = NULL;m_Length-; return true;if ( p->leftChild != NULL && p->rightChild != NULL)Node* pParent = getParent(p);Node* pPre = p->leftChild;Node* ptmp = pPre;while( pPre->right
10、Child != NULL ) ptmp = pPre; pPre = pPre->rightChild; if( ptmp != pPre) ptmp->rightChild = pPre->leftChild; pPre->leftChild = p->leftChild; pPre->rightChild = p->rightChild; elsepPre->rightChild = p->rightChild;if( pParent = NULL ) m_root = pPre;else if( pParent->leftCh
11、ild = p) pParent->leftChild = pPre;else pParent->rightChild = pPre;delete p; p = NULL;m_Length-; return true;template<typename Type> bool BSTrees<Type>:erase2(Type e) Node *p = find(e); if ( p = NULL ) cout<<"There's no this element to delete"<<endl; retur
12、n false;if ( p->leftChild = NULL)Node* pParent = getParent(p);if( pParent->leftChild = p )pParent->leftChild = p->rightChild; elsepParent->rightChild = p->rightChild; delete p;p = NULL;m_Length-; return true;if ( p->rightChild = NULL)Node* pParent = getParent(p);if( pParent->
13、leftChild = p)pParent->leftChild = p->leftChild; elsepParent->rightChild = p->leftChild; delete p;p = NULL;m_Length-; return true;if( p->leftChild != NULL && p->rightChild != NULL) Node* pParent = getParent(p);Node* ptr = p->leftChild; while( ptr->rightChild != NULL )
14、 ptr = ptr->rightChild;ptr->rightChild = p->rightChild;if( pParent = NULL )m_root = p->leftChild;elseif (pParent->leftChild = p) pParent->leftChild = p->leftChild;else pParent->rightChild = p->leftChild;delete p; p = NULL; m_Length-;return true;template<typename Type>
15、; void BSTrees<Type>:clear()if( m_root = NULL )return; clears(m_root); m_root = NULL;template<typename Type> void BSTrees<Type>:clears(Node* &p)if(p->leftChild != NULL)clears(p->leftChild); p->leftChild = NULL; if(p->rightChild != NULL) clears(p->rightChild); p-&
16、gt;rightChild = NULL;delete p;p = NULL; m_Length-;template<typename Type> typename BSTrees<Type>:Node* BSTrees<Type>:getRoot() return m_root;template<typename Type> intBSTrees<Type>:getLength()return m_Length;template<typename Type> typename BSTrees<Type>:No
17、de* BSTrees<Type>:getParent(Node* p) if( p = m_root) return NULL;Node* ptr = m_root;Node* ptf = ptr;while( ptr != NULL )if ( ptr->e = p->e ) return ptf;if ( ptr->e > p->e )ptf = ptr;ptr = ptr->leftChild;elseptf = ptr; ptr = ptr->rightChild;template<typename Type> typ
18、ename BSTrees<Type>:Node* BSTrees<Type>:find(Type e) Node* ptr = m_root;while(ptr != NULL)if ( ptr->e = e )return ptr;if ( ptr->e > e )ptr = ptr->leftChild;elseptr = ptr->rightChild;if ( ptr = NULL ) return NULL;template<typename Type> void BSTrees<Type>:traver
19、se(Node* ptr) if( ptr = NULL )return;if( ptr->leftChild != NULL ) traverse(ptr->leftChild);cout<<"Element value:"<<ptr->e<<endl;if( ptr->rightChild != NULL ) traverse(ptr->rightChild);template<typename Type> BSTrees<Type>:BSTrees() clear();#endif/main.cpp#include <iostream> #include "BSTrees.h" using namespacestd;void main()cout<<"I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于礼仪的小课件
- 装扮布艺笔筒第二课时(教学设计)-2023-2024学年三年级上册综合实践活动辽师大版
- 2024九年级英语下册 Unit 8 Culture Shapes UsLesson 44 Popular Sayings教学实录(新版)冀教版
- 动脉采血操作技巧
- 磁场对通电导线的作用力+高二下学期物理人教版(2019)选择性必修第二册
- 画感觉(教学设计)-2024-2025学年苏少版美术三年级上册
- 2025年中学门卫劳动合同
- 12干点家务活 第二课时 教学设计-2023-2024学年道德与法治一年级下册统编版
- 第12课《蒹葭》教学设计-2024-2025学年统编版语文八年级下册
- 2025二手房屋买卖合同内容详解
- 20210年中考英语复习:阅读理解信息归纳摘录考题汇编(含答案)
- 6.1 感知数字媒体技术-【中职专用】高一信息技术同步课堂(高教版2021·基础模块下册)
- MOOC 信号与系统-西安邮电大学 中国大学慕课答案
- 新疆维吾尔自治区普通高校学生转学申请(备案)表
- 二人合伙投资生意合同
- 拒绝早恋主题班会 课件(34张)2023-2024学年主题班会
- 美容美体艺术专业人才培养方案(中职)
- 第二单元《认识多位数》(单元测试)-2023-2024学年苏教版数学四年级下册
- 山西旅游路线设计方案
- 化学纤维行业操作人员安全培训要点
- 卵巢癌诊治指南乐翔课件
评论
0/150
提交评论