数据结构二叉树基本操作源代码.docx
- 文档编号:4589413
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:27
- 大小:21.67KB
数据结构二叉树基本操作源代码.docx
《数据结构二叉树基本操作源代码.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树基本操作源代码.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构二叉树基本操作源代码
数据结构二叉树基本操作
(1).
//对二叉树的基本操作的类模板封装
//------------------------------------------------------------------------------------------------------------------------
#include
usingnamespacestd;
//------------------------------------------------------------------------------------------------------------------------
//定义二叉树的结点类型BTNode,其中包含数据域、左孩子,右孩子结点。
template
structBTNode
{
Tdata;//数据域
BTNode*lchild;//指向左子树的指针
BTNode*rchild;//指向右子树的指针
};
//------------------------------------------------------------------------------------------------------------------------
//CBinary的类模板
template
classBinaryTree
{
BTNode
public:
BinaryTree(){BT=NULL;}//构造函数,将根结点置空
~BinaryTree(){clear(BT);}//调用Clear()函数将二叉树销毁
voidClearBiTree(){clear(BT);BT=NULL;};//销毁一棵二叉树
voidCreateBiTree(Tend);//创建一棵二叉树,end为空指针域标志
boolIsEmpty();//判断二叉树是否为空
intBiTreeDepth();//计算二叉树的深度
boolRootValue(T&e);//若二叉树不为空用e返回根结点的值,函数返回true,否则函数返回false
BTNode
boolAssign(Te,Tvalue);//找到二叉树中值为e的结点,并将其值修改为value。
TGetParent(Te);//若二叉树不空且e是二叉树中的一个结点那么返回其双亲结点值
TGetLeftChild(Te);//获取左孩子结点值
TGetRightChild(Te);//获取右孩子结点值
TGetLeftSibling(Te);//获取左兄弟的结点值
Trightsibling(BTNode
TGetRightSibling(Te);//获取右孩子的结点值
boolInsertChild(BTNode
boolDeleteChild(BTNode
voidPreTraBiTree();//递归算法:
先序遍历二叉树
voidInTraBiTree();//递归算法:
中序遍历二叉树
voidPostTraBiTree();//递归算法:
后序遍历二叉树
voidPreTraBiTree_N();//非递归算法:
先序遍历二叉树
voidInTraBiTree_N();//非递归算法:
中序遍历二叉树
voidLevelTraBiTree();//利用队列层次遍历二叉树
intLeafCount();//计算叶子结点的个数
BTNode
voidDisplayBTreeShape(BTNode
};
//二叉树的树形显示算法
template
voidBinaryTree
:
DisplayBTreeShape(BTNode
{
if(bt)//空二叉树不显示
{DisplayBTreeShape(bt->rchild,level+1);//显示右子树
cout< for(inti=0;i cout<<"";//确保在第level列显示节点 cout< DisplayBTreeShape(bt->lchild,level+1);//显示左子树 }//if }//DisplayBTree template staticintclear(BTNode {//销毁一棵二叉树 if(bt)//根结点不空 { clear(bt->lchild);//递归调用Clear()函数销毁左子树 clear(bt->rchild);//递归调用Clear()函数销毁右子树 cout<<"释放了指针"< "< deletebt;//释放当前访问的根结点 } return0; } template voidBinaryTree : CreateBiTree(Tend) {//创建一棵二叉树: 先序序列的顺序输入数据,end为结束的标志 cout<<"请按先序序列的顺序输入二叉树,-1为空指针域标志: "< BTNode Tx; cin>>x;//输入根结点的数据 if(x==end)return;//end表示指针为空,说明树为空 p=newBTNode if(! p) { cout<<"申请内存失败! "< exit(-1);//申请内存失败退出 } p->data=x; p->lchild=NULL; p->rchild=NULL; BT=p;//根结点 create(p,1,end);//创建根结点左子树,1为标志,表示左子树 create(p,2,end);//创建根结点右子树,2为标志,表示右子树 } template staticintcreate(BTNode {//静态函数,创建二叉树,k为创建左子树还是右子树的标志,end为空指针域的标志 BTNode Tx; cin>>x; if(x! =end) {//先序顺序输入数据 q=newBTNode q->data=x; q->lchild=NULL; q->rchild=NULL; if(k==1)p->lchild=q;//q为左子树 if(k==2)p->rchild=q;//p为右子树 create(q,1,end);//递归创建左子树 create(q,2,end);//递归创建右子树 } return0; } template boolBinaryTree : IsEmpty() {//判断二叉树是否为空 if(BT==NULL)returntrue;//树根结点为空,说明树为空 returnfalse; } template intBinaryTree : BiTreeDepth() {//利用递归算法计算树的深度 BTNode intdepth=0;//开始的时候数的深度初始化为0 if(bt)//如果树不为空 Depth(bt,1,depth); returndepth; } template staticintDepth(BTNode {//这个函数由BiTreeDepth()函数调用完成树的深度的计算 //其中p是根结点,Level是层,depth用来返回树的深度 if(level>depth)depth=level; if(p->lchild)Depth(p->lchild,level+1,depth);//递归的遍历左子树,并且层数加1 if(p->rchild)Depth(p->rchild,level+1,depth);//递归的遍历右子树,并且层数加1 return0; } template boolBinaryTree : RootValue(T&e) {//若二叉树不为空用e返回根结点的值,函数返回true,否则函数返回false if(BT! =NULL)//判断二叉树是否为空 { e=BT->data;//若不空,则将根结点的数据赋值给e returntrue;//操作成功,返回true } returnfalse;//二叉树为空,返回false } template BTNode : GetRoot() {//获取根信息 returnBT;//返回根结点的指针,若二叉树为空那么返回NULL } template boolBinaryTree : Assign(Te,Tvalue) {//结点赋值 if(SearchNode(e)! =NULL) { (SearchNode(e))->data=value; returntrue; } returnfalse; } template TBinaryTree : GetParent(Te) {//获取双亲信息 BTNode intrear,front; rear=front=0; if(BT) { Queue[rear++]=BT; while(rear! =front) { p=Queue[front++]; if(p->lchild&&p->lchild->data==e||p->rchild&&p->rchild->data==e) returnp->data; else { if(p->lchild)Queue[rear++]=p->lchild; if(p->rchild)Queue[rear++]=p->rchild; } } } returnNULL; } template TBinaryTree : GetRightChild(Te) {//如果二叉树存在,e是二叉树中的一个结点,右子树存在那么返回右子树的结点值,否则返回0并提示右子树为空 BTNode if(p->rchild)returnp->rchild->data;//右子树不空,返回右子树根结点的值 cout<<"结点"< return0; } template TBinaryTree : GetLeftChild(Te) {//如果二叉树存在,e是二叉树中的一个结点,左子树存在那么返回左子树的结点值,否则返回0并提示左子树为空 BTNode if(p->lchild)returnp->lchild->data; cout<<"结点"< return0; } template TBinaryTree : GetLeftSibling(Te) {//获取左兄弟信息 if(BT! =NULL) { returnleftsibling(BT,e); } else {//二叉树为空 cout<<"二叉树为空! "< return0; } } template Tleftsibling(BTNode { Tq=0; if(p==NULL)return0; else { if(p->rchild) { if(p->rchild->data==e) { if(p->lchild)returnp->lchild->data; else returnNULL; } } q=leftsibling(p->lchild,e); if(q)returnq; q=leftsibling(p->rchild,e); if(q)returnq; } return0; } //------------------------------------------------------------------------------------------------------------------------ template TBinaryTree : GetRightSibling(Te) {//获取右兄弟信息 if(BT! =NULL) { returnrightsibling(BT,e); } else {//二叉树为空 cout<<"二叉树为空! "< return0; } } template TBinaryTree : rightsibling(BTNode { BTNode BTNode if(q) { pp=SearchNode(GetParent(e)); if(pp) { if(pp->rchild)returnpp->rchild->data; elsereturn0; } elsereturn0; } return0; } template boolBinaryTree : InsertChild(BTNode {//插入孩子 if(p) { if(LR==0) { c->rchild=p->lchild; p->lchild=c; } else { c->rchild=p->rchild; p->rchild=c; } returntrue; } returnfalse;//p为空 } //------------------------------------------------------------------------------------------------------------------------ template boolBinaryTree : DeleteChild(BTNode {//删除结点 if(p) { if(RL==0) { clear(p->lchild);//释放p右子树的所有结点空间 p->lchild=NULL; } else { clear(p->rchild); p->rchild=NULL; } returntrue;//删除成功 } returnfalse;//p为空 } //------------------------------------------------------------------------------------------------------------------------ template voidBinaryTree : PreTraBiTree() {//先序遍历二叉树 cout<<"----------------------------------------------"< cout<<"先序遍历二叉树: "; BTNode p=BT;//根结点 PreTraverse(p);//从根结点开始先序遍历二叉树 cout< cout<<"----------------------------------------------"< } template staticintPreTraverse(BTNode { if(p! =NULL) { cout< PreTraverse(p->lchild);//递归的调用前序遍历左子树 PreTraverse(p->rchild);//递归的调用前序遍历右子树 } return0; } //------------------------------------------------------------------------------------------------------------------------ template voidBinaryTree : InTraBiTree() {//中序遍历二叉树 cout<<"----------------------------------------------"< cout<<"中序遍历二叉树: "; BTNode p=BT;//根结点 InTraverse(p);//从根结点开始中序遍历二叉树 cout< cout<<"----------------------------------------------"< } template staticintInTraverse(BTNode { if(p! =NULL) { InTraverse(p->lchild);//递归的调用中序遍历左子树 cout< InTraverse(p->rchild);//递归的调用中序遍历右子树 } return0; } //------------------------------------------------------------------------------------------------------------------------ template voidBinaryTree : PostTraBiTree() {//后序遍历二叉树 cout<<"----------------------------------------------"< cout<<"后序遍历二叉树: "; BTNode p=BT;//根结点 PostTraverse(p);//从根结点开始遍历二叉树 cout< cout<<"----------------------------------------------"< } template staticintPostTraverse(BTNode { if(p! =NULL) { PostTraverse(p->lchild);//递归调用后序遍历左子树 PostTraverse(p->rchild);//递归调用后序遍历右子树 cout< } return0; } //------------------------------------------------------------------------------------------------------------------------ template voidBinaryTree : PreTraBiTree_N() {// cout<<"----------------------------------------------"< cout<<"先序(非递归)遍历二叉树得: "; BTNode inttop=0; BTNode while(p! =NULL||top! =0) { while(p! =NULL) { cout< Stack[top++]=p->rchild; p=p->lchild; } if(top! =0) { p=Stack[--top]; } } cout<<"\n----------------------------------------------"< } //------------------------------------------------------------------------------------------------------------------------ template voidBinaryTree : InTraBiTree_N(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 二叉 基本 操作 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)