数据结构专科辅导五.docx
- 文档编号:30091508
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:21
- 大小:19.29KB
数据结构专科辅导五.docx
《数据结构专科辅导五.docx》由会员分享,可在线阅读,更多相关《数据结构专科辅导五.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构专科辅导五
数据结构专科辅导五
---二叉树操作算法
下面给出两个程序,它们都是用来实现对二叉树的操作。
第一个程序采用结构定义二叉树结点的类型,采用普通函数对二叉树进行每一种操作的处理;第二个程序采用类定义二叉树的类型,采用成员函数实现二叉树的每一种操作。
程序1:
//定义二叉树结点结构和操作的头文件btree1.h
//定义二叉树结点值的类型为字符型
typedefcharElemType;
//定义二叉树结点类型
structBTreeNode{
ElemTypedata;
BTreeNode*left;
BTreeNode*right;
};
//初始化二叉树,即把树根指针置空
voidInitBTree(BTreeNode*&BT);
//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构
voidCreateBTree(BTreeNode*&BT,char*a);
//判断二叉树是否为空
boolBTreeEmpty(BTreeNode*BT);
//按任一种遍历次序输出二叉树中的所有结点
voidTraverseBTree(BTreeNode*BT,intmark);
//求二叉树的深度
intBTreeDepth(BTreeNode*BT);
//求二叉树中所有结点数
intBTreeCount(BTreeNode*BT);
//求二叉树中所有叶子结点数
intBTreeLeafCount(BTreeNode*BT);
//按照二叉树的一种表示方法输出整个二叉树
voidPrintBTree(BTreeNode*BT);
//清除二叉树,使之变为一棵空树
voidClearBTree(BTreeNode*&BT);
//二叉树操作的实现文件btree1.cpp
#include
#include
#include
//初始化二叉树,即把树根指针置空
voidInitBTree(BTreeNode*&BT)
{
BT=NULL;
}
//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构
voidCreateBTree(BTreeNode*&BT,char*a)
{
BTreeNode*s[10];//s数组作为存储二叉树中根结点指针的栈
inttop=-1;//top作为s栈的栈顶指针
BT=NULL;//给树根指针置空
BTreeNode*p;//定义p为指向二叉树结点的指针
intk;//用k作为处理结点的左子树和右子树的标记,k=1处理
//左子树,k=2处理右子树
istrstreamins(a);//把字符串a定义为输入字符串流对象ins
charch;
ins>>ch;//从ins流对象顺序读入一个字符,
while(ch!
='@')
{//每循环一次处理一个读入的字符,直到扫描到'@'字符为止
switch(ch)
{
case'(':
top++;s[top]=p;k=1;break;
case')':
top--;break;
case',':
k=2;break;
default:
p=newBTreeNode;
p->data=ch;p->left=p->right=NULL;
if(BT==NULL)BT=p;
else{
if(k==1)s[top]->left=p;
elses[top]->right=p;
}
}
ins>>ch;
}
}
//判断二叉树是否为空
boolBTreeEmpty(BTreeNode*BT)
{
returnBT==NULL;
}
//按任一种遍历次序输出二叉树中的所有结点
voidTraverseBTree(BTreeNode*BT,intmark)
{
if(mark==1){//先序遍历
if(BT!
=NULL){
cout<
TraverseBTree(BT->left,mark);
TraverseBTree(BT->right,mark);
}
}
elseif(mark==2){//中序遍历
if(BT!
=NULL){
TraverseBTree(BT->left,mark);
cout<
TraverseBTree(BT->right,mark);
}
}
elseif(mark==3){//后续遍历
if(BT!
=NULL){
TraverseBTree(BT->left,mark);
TraverseBTree(BT->right,mark);
cout<
}
}
elseif(mark==4)//按层遍历
{
constMaxLength=30;
BTreeNode*Q[MaxLength];
//定义存储二叉树结点指针的数组空间作为队列使用
intfront=0,rear=0;
//定义队首指针和队尾指针,初始均置0表示空队
BTreeNode*p;
if(BT!
=NULL){
rear=(rear+1)%MaxLength;//后移队尾指针
Q[rear]=BT;//将树根结点指针进队
}
while(front!
=rear)
{//当队列非空时执行循环
front=(front+1)%MaxLength;
//后移队首指针
p=Q[front];
//删除队首结点
cout<
//输出队首结点的值
if(p->left!
=NULL)
{//若结点存在左孩子,则左孩子结点指针进队
rear=(rear+1)%MaxLength;
Q[rear]=p->left;
}
if(p->right!
=NULL)
{//若结点存在右孩子,则右孩子结点指针进队
rear=(rear+1)%MaxLength;
Q[rear]=p->right;
}
}
}
else{
cerr<<"mark的值无效!
遍历失败!
"< exit (1); } } //求二叉树的深度 intBTreeDepth(BTreeNode*BT) { if(BT==NULL) return0;//对于空树,返回0并结束递归 else { //计算左子树的深度 intdep1=BTreeDepth(BT->left); //计算右子树的深度 intdep2=BTreeDepth(BT->right); //返回树的深度 if(dep1>dep2)returndep1+1; elsereturndep2+1; } } //求二叉树中所有结点数 intBTreeCount(BTreeNode*BT) { if(BT==NULL)return0; else returnBTreeCount(BT->left)+BTreeCount(BT->right)+1; } //求二叉树中所有叶子结点数 intBTreeLeafCount(BTreeNode*BT) { if(BT==NULL)return0; elseif(BT->left==NULL&&BT->right==NULL)return1; elsereturnBTreeLeafCount(BT->left)+BTreeLeafCount(BT->right); } //按照二叉树的一种表示方法输出整个二叉树 voidPrintBTree(BTreeNode*BT) //输出二叉树的广义表表示 { if(BT==NULL)return;//树为空时返回 else{//否则执行如下操作 cout< if(BT->left! =NULL||BT->right! =NULL) { cout<<'(';//输出左括号 PrintBTree(BT->left);//输出左子树 if(BT->right! =NULL) cout<<',';//若右子树不为空则输出逗号分隔符 PrintBTree(BT->right);//输出右子树 cout<<')';//输出右括号 } } } //清除二叉树,使之变为一棵空树 voidClearBTree(BTreeNode*&BT) { if(BT! =NULL) {//当二叉树非空时进行如下操作 ClearBTree(BT->left);//删除左子树 ClearBTree(BT->right);//删除右子树 deleteBT;//删除根结点 BT=NULL;//置根指针为空 } } //进行二叉树操作的主程序文件btreeMain1.cpp #include #include"btree1.h" #include"btree1.cpp" voidmain() { //定义指向二叉树结点的指针,并用它作为树根指针 BTreeNode*bt; //初始化二叉树,即置树根指针bt为空 InitBTree(bt); //定义一个用于存放二叉树广义表的字符数组 charb[50]; //从键盘向字符数组b输入以'@'字符结束的二叉树广义表 cout<<"输入以'@'字符作为结束符的二叉树广义表表示: "< cin.getline(b,sizeof(b)); //建立以bt作为树根指针的二叉树的链接存储结构 CreateBTree(bt,b); //以广义表形式输出二叉树 PrintBTree(bt); cout< //前序遍历以bt为树根指针的二叉树 cout<<"前序: "; TraverseBTree(bt,1);cout< //中序遍历以bt为树根指针的二叉树 cout<<"中序: "; TraverseBTree(bt,2);cout< //后序遍历以bt为树根指针的二叉树 cout<<"后序: "; TraverseBTree(bt,3);cout< //按层遍历以bt为树根指针的二叉树 cout<<"按层: "; TraverseBTree(bt,4);cout< //求出以bt为树根指针的二叉树的深度 cout<<"二叉树的深度为: "; cout< //求出以bt为树根指针的二叉树中的所有结点数 cout<<"二叉树中的结点数: "; cout< //求出以bt为树根指针的二叉树中的所有叶子结点数 cout<<"二叉树中的叶子结点数: "; cout< //清除以bt为树根指针的二叉树 ClearBTree(bt); } 程序2: //二叉树类定义头文件btree2.h //定义二叉树结点值的类型为字符型 typedefcharElemType; //定义二叉树结点类型 structBTreeNode{ ElemTypedata; BTreeNode*left; BTreeNode*right; }; //定义二叉树类 classBinaryTree{ BTreeNode*root; public: //构造函数,初始化二叉树为空 BinaryTree(){root=NULL;} //根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构 voidCreateBTree(char*a); //判断二叉树是否为空 boolBTreeEmpty(){returnroot==NULL;} //按任一种遍历次序输出二叉树中的所有结点 voidTraverseBTree(intmark); //求二叉树的深度 intBTreeDepth(); //求二叉树中所有结点数 intBTreeCount(); //求二叉树中所有叶子结点数 intBTreeLeafCount(); //按照二叉树的一种表示方法输出整个二叉树 voidPrintBTree(); //析构函数,清除二叉树 ~BinaryTree(); }; //二叉树类的实现文件btree2.cpp #include #include #include staticvoidTraverse(BTreeNode*BT,intmark); staticintDepth(BTreeNode*BT); staticintCount(BTreeNode*BT); staticintLeafCount(BTreeNode*BT); staticvoidPrint(BTreeNode*BT); staticvoidClear(BTreeNode*&BT); //根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构 voidBinaryTree: : CreateBTree(char*a) { BTreeNode*s[20];//s数组作为存储二叉树中根结点指针的栈 inttop=-1;//top作为s栈的栈顶指针 root=NULL;//给树根指针置空 BTreeNode*p;//定义p为指向二叉树结点的指针 intk;//用k作为处理结点的左子树和右子树的标记,k=1处理 //左子树,k=2处理右子树 istrstreamins(a);//把字符串a定义为输入字符串流对象ins charch; ins>>ch;//从ins流对象顺序读入一个字符, while(ch! ='@') {//每循环一次处理一个读入的字符,直到扫描到'@'字符为止 switch(ch) { case'(': top++;s[top]=p;k=1;break; case')': top--;break; case',': k=2;break; default: p=newBTreeNode; p->data=ch;p->left=p->right=NULL; if(root==NULL)root=p; else{ if(k==1)s[top]->left=p; elses[top]->right=p; } } ins>>ch; } } //按任一种遍历次序输出二叉树中的所有结点 voidBinaryTree: : TraverseBTree(intmark) { Traverse(root,mark); } //用于遍历的递归函数 voidTraverse(BTreeNode*BT,intmark) { if(mark==1){//先序遍历 if(BT! =NULL){ cout< Traverse(BT->left,mark); Traverse(BT->right,mark); } } elseif(mark==2){//中序遍历 if(BT! =NULL){ Traverse(BT->left,mark); cout< Traverse(BT->right,mark); } } elseif(mark==3){//后续遍历 if(BT! =NULL){ Traverse(BT->left,mark); Traverse(BT->right,mark); cout< } } elseif(mark==4)//按层遍历 { constMaxLength=30; BTreeNode*Q[MaxLength]; //定义存储二叉树结点指针的数组空间作为队列使用 intfront=0,rear=0; //定义队首指针和队尾指针,初始均置0表示空队 BTreeNode*p; if(BT! =NULL){ rear=(rear+1)%MaxLength;//后移队尾指针 Q[rear]=BT;//将树根结点指针进队 } while(front! =rear) {//当队列非空时执行循环 front=(front+1)%MaxLength; //后移队首指针 p=Q[front]; //删除队首结点 cout< //输出队首结点的值 if(p->left! =NULL) {//若结点存在左孩子,则左孩子结点指针进队 rear=(rear+1)%MaxLength; Q[rear]=p->left; } if(p->right! =NULL) {//若结点存在右孩子,则右孩子结点指针进队 rear=(rear+1)%MaxLength; Q[rear]=p->right; } } } else{ cerr<<"mark的值无效! 遍历失败! "< exit (1); } } //求二叉树的深度 intBinaryTree: : BTreeDepth() { returnDepth(root); } //用于求二叉树深度的递归函数 intDepth(BTreeNode*BT) { if(BT==NULL) return0;//对于空树,返回0并结束递归 else { //计算左子树的深度 intdep1=Depth(BT->left); //计算右子树的深度 intdep2=Depth(BT->right); //返回树的深度 if(dep1>dep2)returndep1+1; elsereturndep2+1; } } //求二叉树中所有结点数 intBinaryTree: : BTreeCount() { returnCount(root); } //用于求二叉树中所有结点数的递归函数 intCount(BTreeNode*BT) { if(BT==NULL)return0; else returnCount(BT->left)+Count(BT->right)+1; } //求二叉树中所有叶子结点数 intBinaryTree: : BTreeLeafCount() { returnLeafCount(root); } //用于求二叉树中所有叶子结点数的递归函数 intLeafCount(BTreeNode*BT) { if(BT==NULL)return0; elseif(BT->left==NULL&&BT->right==NULL)return1; elsereturnLeafCount(BT->left)+LeafCount(BT->right); } //按照二叉树的广义表表示输出整个二叉树 voidBinaryTree: : PrintBTree() { Print(root); } //用于输出整个二叉树的递归函数 voidPrint(BTreeNode*BT) //输出二叉树的 { if(BT==NULL)return;//树为空时返回 else{//否则执行如下操作 cout< if(BT->left! =NULL||BT->right! =NULL) { cout<<'(';//输出左括号 Print(BT->left);//输出左子树 if(BT->right! =NULL) cout<<',';//若右子树不为空则输出逗号分隔符 Print(BT->right);//输出右子树 cout<<')';//输出右括号 } } } //析构函数,清除二叉树 BinaryTree: : ~BinaryTree() { Clear(root); } //用于清除二叉树的递归函数 voidClear(BTreeNode*&BT) { if(BT! =NULL) {//当二叉树非空时进行如下操作 Clear(BT->left);//删除左子树 Clear(BT->right);//删除右子树 deleteBT;//删除根结点 BT=NULL;//置根指针为空 } } //进行二叉树操作的主文件btreeMain2.cpp #include #include"btree2.h" #include"btree2.cpp" voidmain() { //定义一棵二叉树 BinaryTreebt; //定义一个用于存放二叉树广义表的字符数组 charb[50]; //从键盘向字符数组b输入以'@'字符结束的二叉树广义表 cout<<"输入以'@'字符作为结束符的二叉树广义表表示: "< cin.getline(b,sizeof(b)); //根据字符数组b建立bt二叉树的链接存储结构 bt.CreateBTree(b); //以广义表形式输出bt二叉树 bt.PrintBTree(); cout< //前序遍历bt二叉树 cout<<"前序: "; bt.TraverseBTree (1);cout< //中序遍历bt二叉树 cout<<"中序: "; bt.TraverseBTree(2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 专科 辅导