树和二叉树.docx
- 文档编号:3765163
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:30
- 大小:653.42KB
树和二叉树.docx
《树和二叉树.docx》由会员分享,可在线阅读,更多相关《树和二叉树.docx(30页珍藏版)》请在冰豆网上搜索。
树和二叉树
二叉树链表
1BiTree.h
#include
usingnamespacestd;
constintmaxSize=100;
template
structBiNode
{DataTypedata;
BiNode
};
template
classBiTree
{
public:
BiTree()
{cout<<"root="< root=Creat(root);//构造函数,建立一棵二叉树 } ~BiTree(){Release(root);}//析构函数 voidPreOrder(){PreOrder(root);}//前序遍历二叉树 voidInOrder(){InOrder(root);}//中序遍历二叉树 voidPostOrder(){PostOrder(root);}//后序遍历二叉树 voidLeverOrder();//层序遍历二叉树 voidCount()//求二叉树的结点个数 {count=0; Count(root); cout<<"二叉树的结点个数: "< }; intDepth(){returnDepth(root);}//求二叉树的深度 BiNode {returnFindNode(root,x);} private: BiNode BiNode voidRelease(BiNode voidPreOrder(BiNode voidInOrder(BiNode voidPostOrder(BiNode voidCount(BiNode intDepth(BiNode //查找结点x的函数调用 BiNode intcount;//结点个数计算器 }; //构造函数——建立二叉树 template BiNode : Creat(BiNode {DataTypech;cin>>ch;//输入结点的数据信息,假设为字符 cout<<"*bt="< if(ch=='#')bt=NULL;//建立一棵空树 else{ bt=newBiNode bt->data=ch;//生成一个结点,数据域为ch cout<<"新建bt="< "R="< bt->lchild=Creat(bt->lchild);//递归建立左子树 bt->rchild=Creat(bt->rchild);//递归建立右子树 cout<<"bt="< <<"bt- } returnbt; }; //析构函数 template voidBiTree : Release(BiNode {if(bt! =NULL) {Release(bt->lchild);//释放左子树 Release(bt->rchild);//释放右子树 deletebt; } //cout<<"析构函数"< }; //前序遍历——递归算法 template voidBiTree : PreOrder(BiNode {if(bt==NULL) {cout<<"#"; return;//递归调用的结束条件 } else{ cout< PreOrder(bt->lchild);//前序递归遍历bt的左子树 PreOrder(bt->rchild);//前序递归遍历bt的右子树 } }; //中序遍历——递归算法 template voidBiTree : InOrder(BiNode {if(bt==NULL) {cout<<"#";return;}//递归调用的结束条件 else{ InOrder(bt->lchild);//中序递归遍历bt的左子树 cout< InOrder(bt->rchild);//中序递归遍历bt的右子树 } }; //后序遍历——递归算法 template voidBiTree : PostOrder(BiNode {if(bt==NULL) {cout<<"#";return;}//递归调用的结束条件 else{ PostOrder(bt->lchild);//后序递归遍历bt的左子树 PostOrder(bt->rchild);//后序递归遍历bt的右子树 cout< } }; //层序遍历 template voidBiTree : LeverOrder() {intfront,rear; BiNode front=rear=-1;//采用顺序队列,并假定不会发生上溢 if(root==NULL)return;//二叉树为空,算法结束 Q[++rear]=root;//根指针入队 while(front! =rear)//当队列非空时 {q=Q[++front];//出队 cout< if(q->lchild! =NULL)Q[++rear]=q->lchild; if(q->rchild! =NULL)Q[++rear]=q->rchild; } }; //求二叉树的结点个数 template voidBiTree : Count(BiNode {if(bt==NULL)return; else{ Count(bt->lchild); count++; Count(bt->rchild); } }; //求二叉树的深度函数调用 template intBiTree : Depth(BiNode {inthl,hr; if(bt==NULL)return0; else{ hl=Depth(bt->lchild); hr=Depth(bt->rchild); returnmax(hl,hr)+1; } }; //查找结点x template BiNode : FindNode(BiNode {BiNode if(bt==NULL)returnNULL; if(bt->data==x)returnbt; else {p=FindNode(bt->lchild,x); if(p! =NULL)returnp; elsereturnFindNode(bt->rchild,x); } }; #include"BiTree.h" voidmain() {cout<<"前序遍历请输入字符结点,#表示空子树"< BiTree cout<<"前序遍历"< a.PreOrder(); cout<<"\n中前序遍历"< a.InOrder(); cout<<"\n后前序遍历"< a.PostOrder(); cout<<"\n层前序遍历"< a.LeverOrder(); cout< cout<<"\n求结点个数: "< a.Count(); cout<<"\n求二叉树的深度: "; cout< cout<<"\n查找结点D: "; BiNode p=a.FindNode('D'); cout< } 二叉树非递归遍历 (1)前序遍历 (2)中序遍历 (3)后序遍历 (4)层序遍历 3FBiTree.h #include usingnamespacestd; constintmaxSize=100; template structBiNode { DataTypedata; BiNode }; template structFBiNode { FBiNode(){ptr=NULL;} BiNode intflag;//1表示第1次出栈,2表示第2次出栈 }; template classBiTree { public: BiTree(){root=Creat(root);}//构造函数,建立一棵二叉树 ~BiTree(){Release(root);}//析构函数 voidPreOrder();//前序遍历二叉树 voidInOrder();//中序遍历二叉树 voidPostOrder();//后序遍历二叉树 voidLeverOrder();//层序遍历二叉树 private: BiNode BiNode voidRelease(BiNode }; //构造函数——建立二叉树 template BiNode : Creat(BiNode {DataTypech; cin>>ch;//输入结点的数据信息,假设为字符 if(ch=='#')bt=NULL;//建立一棵空树 else{ //生成一个结点,数据域为ch bt=newBiNode bt->lchild=Creat(bt->lchild);//递归建立左子树 bt->rchild=Creat(bt->rchild);//递归建立右子树 } returnbt; }; //析构函数 template voidBiTree : Release(BiNode {if(bt! =NULL) {Release(bt->lchild);Release(bt->rchild);deletebt;} }; //前序遍历——非递归算法 template voidBiTree : PreOrder() {BiNode inttop=-1;//采用顺序栈,并假定不会发生上溢 while(bt! =NULL||top! =-1) {while(bt! =NULL)//进栈 {cout< s[++top]=bt;bt=bt->lchild; } if(top! =-1) {bt=s[top--];//出栈 bt=bt->rchild; } } cout< }; //中序遍历——非递归算法 template voidBiTree : InOrder() {BiNode inttop=-1;//采用顺序栈,并假定不会发生上溢 while(bt! =NULL||top! =-1) {while(bt! =NULL) {s[++top]=bt;bt=bt->lchild;} if(top! =-1){ bt=s[top--];cout< bt=bt->rchild; } } cout< }; //后序遍历——非递归算法 template voidBiTree : PostOrder() {BiNode FBiNode inttop=-1;//采用顺序栈,并假定不会发生上溢 while(bt! =NULL||top! =-1)//两个条件都不成立才退出循环 {while(bt! =NULL)//遍历左子树 {//root连同标志flag入栈 s[++top].ptr=bt;s[top].flag=1; bt=bt->lchild; } while(top! =-1&&s[top].flag==2) {bt=s[top--].ptr;cout< if(top! =-1) {s[top].flag=2;bt=s[top].ptr;bt=bt->rchild;}else {bt=NULL;} } cout< }; //层序遍历 template voidBiTree : LeverOrder() {intfront,rear; BiNode BiNode front=rear=-1;//采用顺序队列,并假定不会发生上溢 if(root==NULL)return;//二叉树为空,算法结束 Q[++rear]=root;//根指针入队 while(front! =rear)//当队列非空时 {q=Q[++front];//出队 cout< if(q->lchild! =NULL)Q[++rear]=q->lchild; if(q->rchild! =NULL)Q[++rear]=q->rchild; } }; #include"FBiTree.h" voidmain() { cout<<"前序遍历请输入字符结点,#表示空子树"< BiTree cout<<"前序遍历"< a.PreOrder(); cout<<"中前序遍历"< a.InOrder(); cout<<"后前序遍历"< a.PostOrder(); cout<<"\n层前序遍历"< a.LeverOrder(); cout< } 线索二叉树链表 2InThrBiTree.h #include usingnamespacestd; template structThrNode {intltag,rtag; DataTypedata; ThrNode }; //中序线索链表类的声明 template classInThrBiTree {public: InThrBiTree();//构造函数,建立中序线索链表 ~InThrBiTree(){};//析构函数,释放各结点的存储空间 ThrNode //查找p的后继结点 voidInOrder();//中序遍历线索链表 private: ThrNode ThrNode //构造函数调用 voidThrBiTree(ThrNode voidRelease(ThrNode }; //中序线索链表构造函数算法 template InThrBiTree : InThrBiTree() {ThrNode root=Creat(root);//建立带线索标志的二叉链表 pre=NULL;//当前访问结点的前驱结点pre ThrBiTree(root,pre);//遍历二叉链表,建立线索 }; //建立二叉树链表(带线索标志)算法 template ThrNode : Creat(ThrNode {DataTypech;cin>>ch;//前序字符输入结点的数据信息 if(ch=='#')bt=NULL;//建立一棵空树 else {bt=newThrNode bt->ltag=0;bt->rtag=0;//左右标志均置为0 bt->lchild=Creat(bt->lchild);//递归建立左子树 bt->rchild=Creat(bt->rchild);//递归建立右子树 } returnbt;}; //中序线索化链表算法 template voidInThrBiTree : ThrBiTree(ThrNode *bt,ThrNode {if(bt==NULL)return; ThrBiTree(bt->lchild,pre); if(bt->lchild==NULL)//对bt的左指针进行处理 {bt->ltag=1;bt->lchild=pre;}//设置pre的前驱线索 if(pre! =NULL&&pre->rtag==1)pre->rchild=bt; //设置pre的后继线索 if(bt->rchild==NULL)bt->rtag=1;//对bt的右指针进行处理 pre=bt; ThrBiTree(bt->rchild,pre); cout<<"Hlltag="< <<"rtag="< <<"bt->rchild="< }; //析构函数 template voidInThrBiTree : Release(ThrNode {if(bt! =NULL) {Release(bt->lchild);Release(bt->rchild); deletebt;} }; //中序遍历 template
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉