实验十叉树的进步操作.docx
- 文档编号:6465474
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:14
- 大小:53.81KB
实验十叉树的进步操作.docx
《实验十叉树的进步操作.docx》由会员分享,可在线阅读,更多相关《实验十叉树的进步操作.docx(14页珍藏版)》请在冰豆网上搜索。
实验十叉树的进步操作
浙江大学城市学院实验报告
课程名称数据结构基础
实验项目名称实验十一二叉树的进一步操作
学生姓名专业班级学号
实验成绩指导老师(签名)日期2014-12-25
一.实验目的和要求
1、熟练掌握二叉树二叉链表的存储结构。
2、进一步掌握在二叉链表上的二叉树操作的实现原理与方法。
3、掌握中序遍历的非递归算法。
二.实验内容
1、实现以下说明的操作函数,添加到实验十所写的头文件binary_tree.h中,并建立主函数文件test4_2.cpp,编写测试语句加以验证。
操作函数如下:
①voidInOrder2(BTreeNode*BT);
//非递归中序遍历二叉树BT
②voidChangeBTree(BTreeNode*&BT);
//将二叉树中的所有结点的左右子树进行交换:
③IntCountBTree(BTreeNode*BT);
//统计二叉树中的所有结点数并返回
④BTreeNode*CopyBTree(BTreeNode*BT);
//复制一棵二叉树,并返回复制得到的二叉树根结点指针
2、选做:
实现以下说明的操作函数,添加到头文件binary_tree.h中,并在主函数文件test4_2.cpp中添加相应语句进行测试。
①intSimilarTrees(BTreeNode*BT1,BTreeNode*BT2)
//判断两棵二叉树是否相似。
所谓相似是指如果两棵二叉树具有相同的树型,则称它们是相似的,否则不是。
②BTreeNode*RemoveLeaves(BTreeNode*BT1)
//摘树叶:
摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树。
3、填写实验报告,实验报告文件取名为report11.doc。
4、上传实验报告文件report11.doc、源程序文件test4_2.cpp及binary_tree.h到Ftp服务器上自己的文件夹下。
三.函数的功能说明及算法思路
(包括每个函数的功能说明,及一些重要函数的算法实现思路)
结构定义:
二叉树:
structBTreeNode{
ElemTypedata;
BTreeNode*lchild;
BTreeNode*rchild;
};
顺序栈:
structStack{
BTreeNode**stack;//存栈元素
inttop;
intMaxSize;
};
Operations:
二叉树:
voidInitBTree(BTreeNode*&BT)//初始化二叉树BT
voidCreateBTree(BTreeNode*&BT,char*a)
//根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构
voidPrintBTree(BTreeNode*BT)//输出二叉树BT
voidClearBTree(BTreeNode*&BT)//清除二叉树BT
voidInOrder2(BTreeNode*BT)//非递归中序遍历二叉树BT
voidChangeBTree(BTreeNode*&BT)
//将二叉树中的所有结点的左右子树进行交换
intCountBTree(BTreeNode*BT)//统计二叉树中的所有结点数并返回
BTreeNode*CopyBTree(BTreeNode*BT)
//复制一棵二叉树,并返回复制得到的二叉树根结点指针
intSimilarTrees(BTreeNode*BT1,BTreeNode*BT2)
//判断两棵二叉树是否相似。
所谓相似是指如果两棵二叉树具有相同的树型,则称它们是相似的,否则不是。
BTreeNode*RemoveLeaves(BTreeNode*BT1)
//摘树叶:
摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树。
顺序栈:
voidInitStack(Stack&S)//初始化栈为空,把栈设置为空并完成栈空间的动态存储分配
voidPush(Stack&S,BTreeNode*item)//元素item进栈,即插入到栈顶
BTreeNode*Pop(Stack&S)//删除栈顶元素并返回
boolEmptyStack(Stack&S)//判断S是否为空,若为空则返回true,否则返回false
voidClearStack(Stack&S)//清除栈S中的所有元素,释放动态存储空间
endGeneralTree
算法:
voidInOrder2(BTreeNode*BT)//非递归中序遍历二叉树BT
{
定义堆栈s
定义树结点P
初始化栈s
while(p不为空或者s不为空)
{
if(p不为空)
将p进栈;P的值重新赋为p的左孩子
if(s不为空)
将出栈的值赋给p;输出p的根的值;P等于p的右边孩子;
}
}
voidChangeBTree(BTreeNode*&BT)
{//将二叉树中的所有结点的左右子树进行交换
定义树结点P//用作中间值防止树被破坏
if(BT不为空){
if(BT的左、右孩子都不为空)
定义树结点P,将p的左孩子赋值给P
BT的左孩子等于BT的右孩子
BT的右孩子等于p
递归调用交换左子树;递归调用交换右子树;}
}
intCountBTree(BTreeNode*BT)//统计二叉树中的所有结点数并返回
{
if(树为空)返回0;
elseif(BT的左、右孩子等于空)返回1;
else
return递归调用左孩子个数+递归调用右孩子个数+1;
}
BTreeNode*CopyBTree(BTreeNode*BT)
{//复制一棵二叉树,并返回复制得到的二叉树根结点指针
定义树结点P
if(BT为空)返回空
else
{
定义树结点P,并给以内存为
将BT的根结点,左结点,右结点复制给p
返回p;}
}
intSimilarTrees(BTreeNode*BT1,BTreeNode*BT2)
{
//判断两棵二叉树是否相似。
所谓相似是指如果两棵二叉树具有相同的树型,则称它们是相似的,否则不是。
设置变量like1以及like2用于保留左子树以及右子树是否相似的值
if(BT1和BT2为空)返回1;
elseif(BT1和BT2中有一个为空)返回0;
else
返回递归调用左孩子相似函数&&递归调用右孩子相似函数
}
BTreeNode*RemoveLeaves(BTreeNode*BT1)
{//摘树叶:
摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树
if(BT1为空)返回空;
elseif(BT1左孩子和右孩子为空值)
删除BT1,并且返回NULL
else
{BT1->lchild=递归调用BT1的左孩子;
BT1->rchild=递归调用BT1的右孩子;}
返回BT1;
}
四.实验结果与分析
(包括运行结果截图、结果分析等)
五.心得体会
(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
)
做二叉树相似的时候,条件(BT1和BT2为空)和(BT1和BT2中有一个为空)没有分出来,认为||就将两个条件概括了。
之后才找出来错误
【附录----源程序】
test4_2.cpp:
#include
#include
#include
typedefcharElemType;
#include"binary_tree.h"
voidmain(){
BTreeNode*BT1,*BT2,*BT3;
chara[50];
InitBTree(BT1);
InitBTree(BT2);
cout<<"请输入二叉树BT1的广义表:
"< gets(a); CreateBTree(BT1,a); cout<<"请输入二叉树BT2的广义表: "< gets(a); CreateBTree(BT2,a); cout<<"中序序列(非递归): "; InOrder2(BT1); cout< cout<<"交换二叉树BT1中的所有结点的左右子树: "< ChangeBTree(BT1); PrintBTree(BT1); cout< cout<<"二叉树BT1共有"< InitBTree(BT3); cout<<"复制二叉树BT1: "< cout<<"原二叉树BT1: "; PrintBTree(BT1);cout< cout<<"复制后的二叉树BT3: "; BT3=CopyBTree(BT1); PrintBTree(BT3); cout< if(SimilarTrees(BT1,BT2)) cout<<"二叉树BT1与二叉树BT2相似"< else cout<<"二叉树BT1与二叉树BT2不相似"< cout<<"摘树叶: 摘除二叉树BT1的所有叶子结点: "; RemoveLeaves(BT1); cout<<"输出摘除叶子结点的二叉树BT1: "< PrintBTree(BT1); cout< ClearBTree(BT1); ClearBTree(BT2); ClearBTree(BT3); } binary_tree.h: //------------------------------栈操作------------------ structBTreeNode{ ElemTypedata; BTreeNode*lchild; BTreeNode*rchild; }; structStack{ BTreeNode**stack;//存栈元素 inttop; intMaxSize; }; voidInitStack(Stack&S)//初始化栈为空,把栈设置为空并完成栈空间的动态存储分配 { S.MaxSize=10;//栈空间大小为10 S.stack=newBTreeNode*[S.MaxSize]; if(! S.stack){ cerr<<"动态存储分配失败! "< exit (1); } S.top=-1; } voidPush(Stack&S,BTreeNode*item)//元素item进栈,即插入到栈顶 { if(S.top==S.MaxSize-1){ intk=sizeof(BTreeNode); S.stack=(BTreeNode**)realloc(S.stack,2*S.MaxSize*k); S.MaxSize=2*S.MaxSize; } S.top++;//栈顶指针加1表示后移一个位置 S.stack[S.top]=item; } BTreeNode*Pop(Stack&S)//删除栈顶元素并返回 { if(S.top==-1){ cerr<<"栈空! "< exit (1); } S.top--;//栈顶指针减1表示退栈 returnS.stack[S.top+1]; } boolEmptyStack(Stack&S)//判断S是否为空,若为空则返回true,否则返回false { returnS.top==-1; } voidClearStack(Stack&S)//清除栈S中的所有元素,释放动态存储空间 { if(S.stack){ delete[]S.stack; S.stack=0; } S.top=-1; S.MaxSize=0; } //-------------------------二叉树基本操作---------------------- voidInitBTree(BTreeNode*&BT) {//初始化二叉树BT BT=NULL; } voidCreateBTree(BTreeNode*&BT,char*a) {//根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构 constintMaxSize=10;//栈数组长度>=二叉树的深度减1 BTreeNode*s[MaxSize];//s数组作为存储根结点指针的栈使用 inttop=-1;//top为栈顶指针,表示栈空 BTreeNode*p;//二叉树结点指针 intk,i=0;//k=1时处理左子树,k=2处理右子树 while(a[i]){ switch(a[i]){ case'': break; case'(': if(top==MaxSize-1){ cout<<"栈空间太小,请增加MaxSize的值! "< exit (1);} top++; s[top]=p;k=1; break; case')': if(top==-1){ cout<<"二叉树广义表字符串错! "< exit (1);} top--; break; case',': k=2; break; default: p=newBTreeNode; p->data=a[i]; p->lchild=p->rchild=NULL; if(BT==NULL) BT=p; else{ if(k==1)s[top]->lchild=p; elses[top]->rchild=p;} } i++;} } voidPrintBTree(BTreeNode*BT) {//输出二叉树BT if(BT! =NULL){ cout< if(BT->lchild! =NULL||BT->rchild! =NULL){//若非叶子结点,则递归调用输出左右子树 cout<<'('; PrintBTree(BT->lchild); if(BT->rchild! =NULL){ cout<<','; PrintBTree(BT->rchild); } cout<<')';} } } voidClearBTree(BTreeNode*&BT) {//清除二叉树BT if(BT! =NULL){ ClearBTree(BT->lchild); ClearBTree(BT->rchild); free(BT); BT=NULL; } } //------------------------二叉树操作-------------------- voidInOrder2(BTreeNode*BT)//非递归中序遍历二叉树BT { Stacks; BTreeNode*p=BT; InitStack(s); while(p! =NULL||! EmptyStack(s)){ while(p! =NULL){ Push(s,p); p=p->lchild;} if(! EmptyStack(s)){ p=Pop(s); cout< p=p->rchild;} } ClearStack(s); } voidChangeBTree(BTreeNode*&BT)//将二叉树中的所有结点的左右子树进行交换 { if(BT! =NULL){ if(BT->lchild! =NULL&&BT->rchild! =NULL){ BTreeNode*p=BT->lchild; BT->lchild=BT->rchild; BT->rchild=p;} ChangeBTree(BT->lchild); ChangeBTree(BT->rchild); } } intCountBTree(BTreeNode*BT)//统计二叉树中的所有结点数并返回 { if(BT==NULL) return0; elseif(BT->lchild==NULL&&BT->rchild==NULL) return1; else returnCountBTree(BT->lchild)+CountBTree(BT->rchild)+1; } BTreeNode*CopyBTree(BTreeNode*BT)//复制一棵二叉树,并返回复制得到的二叉树根结点指针 { if(BT==NULL)returnNULL; else{ BTreeNode*p=(BTreeNode*)malloc(sizeof(BTreeNode)); p->data=BT->data; p->lchild=CopyBTree(BT->lchild); p->rchild=CopyBTree(BT->rchild); returnp; } } intSimilarTrees(BTreeNode*BT1,BTreeNode*BT2) {//判断两棵二叉树是否相似。 所谓相似是指如果两棵二叉树具有相同的树型,则称它们是相似的,否则不是。 if(BT1==NULL&&BT2==NULL)return1; elseif(BT1==NULL||BT2==NULL)return0; else returnSimilarTrees(BT1->lchild,BT2->lchild)&&SimilarTrees(BT1->rchild,BT2->rchild); } BTreeNode*RemoveLeaves(BTreeNode*BT1)//摘树叶: 摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树。 { if(BT1==NULL)returnNULL; elseif(BT1->lchild==NULL&&BT1->rchild==NULL){ free(BT1); returnNULL; } else{ BT1->lchild=RemoveLeaves(BT1->lchild); BT1->rchild=RemoveLeaves(BT1->rchild); } returnBT1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 十叉树 进步 操作
![提示](https://static.bdocx.com/images/bang_tan.gif)