浙大城院数据结构report11_浙大城院

2020-02-27 其他范文 下载本文

浙大城院数据结构report11由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“浙大城院”。

浙江大学城市学院实验报告

课程名称

数据结构基础

实验项目名称

实验十一

二叉树的进一步操作

学生姓名

专业班级

学号

实验成绩

指导老师(签名)

日期

三.函数的功能说明及算法思路

(包括每个函数的功能说明,及一些重要函数的算法实现思路)算法

//非递归中序遍历二叉树BT

void In_Order2(BTreeNode *BT){

定义一个堆栈s,并初始化堆栈

定义一个和BT相等的树结点P

while(堆栈不为空或者p不为空)

{

if(p不为空)

将p进栈 ;P重新赋值等于p的左孩纸

else

P等于出栈的值;输出p的根的值 ;P等于p的右边孩纸;

} }

//将二叉树中的所有结点的左右子树进行交换

void ChangeBTree(BTreeNode *BT){ 定义一个和BT相等的树结点P//用作中间值防止树被破坏

if(BT不是空)

{ P等于p的左孩纸

BT的左孩纸等于BT的右孩纸

BT的右孩纸等于p

递归交换左子树

递归交换右子树

} }

//统计二叉树中的所有结点数

int CountBTree(BTreeNode *BT){

if(树为空)返回0;

else

if(BT的左孩纸等于右孩纸等于空)返回1;

else

return 左孩纸个数+右孩纸个数+1;

}

//复制一棵二叉树,并返回复制得到的二叉树根结点指针

BTreeNode *CopyBTree(BTreeNode *BT){

定义树结点P

if(BT不为空)

{ 为p开辟内存

依次复制根节点,左节点,右节点;

返回p;}

else

返回空; }

//如果两棵二叉树具有相同的树型,则称它们是相似的 int SimilarTrees(BTreeNode *BT1,BTreeNode *BT2){

设置变量like1以及like2用于保留左子树以及右子树是否相似的值

if(BT1以及BT2等于空)

返回1;

else

if(BT1和BT2中只有一个为空)

返回0;

else

{

like1=递归函数,判断BT1以及BT2的左孩纸是否相等

like2=递归函数,判断BT1以及BT2的右孩纸是否相等

return

like1&&like2;

} }

//摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树

BTreeNode * RemoveLeaves(BTreeNode *BT1){

if(BT1为空)

return空值;

else

if(BT1左孩纸和右孩纸为空值)

删除BT1,并且返回NULL

else

{ BT1->lchild=递归调用BT1的左孩纸

BT1->rchild=递归调用BT1的右孩纸;

}

返回BT1; } 四.实验结果与分析(包括运行结果截图、结果分析等)

五.心得体会

失败点:在相似的二叉树理解上费时了很久,将二叉树相似和二叉树相等不能很好的区分

【附录----源程序】

test4_2.cpp #include #include #include

typedef char ElemType;

struct BTreeNode {

ElemType data;

BTreeNode *lchild;

BTreeNode *rchild;};

#include“binary_tree.h”

void main(){

BTreeNode *T1,*T2,*T3;

char ch[80],x;//x用于存放查找的数据

InitBTree(T1);

//初始化二叉树

cout

EmptyBTree(T1)?cout

printf(“请输入广义表:”);gets(ch);

//将广义表保存在ch字符串中

CreateBTree(T1,ch);

//建立二叉树

EmptyBTree(T1)?cout

cout

printf(“输入要查找的元素1:”);cin>>x;

FindBTree(T1,x)?cout

printf(“输入要查找的元素2:”);cin>>x;

FindBTree(T1,x)?cout

cout

PreOrder(T1);cout

cout

InOrder(T1);cout

cout

PostOrder(T1);cout

cout

LevelOrder(T1);cout

cout

PrintBTree(T1);cout

/*————————————————————————————————*/

cout

cout

In_Order2(T1);cout

printf(“交换前:”);PrintBTree(T1);cout

ChangeBTree(T1);

//交换左右子树

printf(“交换后:”);PrintBTree(T1);cout

cout

InitBTree(T2);

//初始化二叉树

T2=CopyBTree(T1);

cout

//输出二叉树

PrintBTree(T1);cout

cout

//输出二叉树

PrintBTree(T2);cout

printf(“请输入广义表:”);

gets(ch);

//将广义表保存在ch字符串中

CreateBTree(T3,ch);

//建立二叉树

if(SimilarTrees(T1,T3))

//比较T1与T3是否相似

cout

cout

if(SimilarTrees(T1,T2))

//比较T1与T2是否相似

cout

cout

cout

//输出二叉树

PrintBTree(T1);cout

RemoveLeaves(T1);

//摘除叶子结点

cout

//输出二叉树

PrintBTree(T1);cout

binary_tree.h

/*——————————————顺序栈的操作——————————————*/

struct Stack { BTreeNode **stack;// 存栈元素

int top;

// 栈顶指示器

};

void InitStack(Stack &S)

//构造一个空栈 S {

}

int EmptyStack(Stack S)

//若栈S为空栈返回1,否则返回0 {

}

void Push(Stack &S, BTreeNode * item)

//元素 item进栈

{

}

BTreeNode * Pop(Stack &S)

//栈S的栈顶元素出栈并返回

{

BTreeNode * temp;

if(S.top==-1)

{ cout

if(S.top==S.MaxSize-1)

{

} S.top++;

S.stack[S.top]=item;S.stack=(BTreeNode**)realloc(S.stack,S.MaxSize*sizeof(BTreeNode *)*2);

S.MaxSize*=2;

return S.top==-1;S.MaxSize=10;

S.stack=(BTreeNode**)malloc(S.MaxSize *sizeof(BTreeNode *));

if(!S.stack){

}

S.top=-1;

cout

exit(1);

int MaxSize;

// 栈的最大长度

}

} exit(1);

S.top--;

temp=S.stack[S.top+1];

return temp;

BTreeNode * Peek(Stack S)

//取栈S的当前栈顶元素并返回

{

}

/*——————————————循环队列的操作———————————*/ struct Queue {

};

void InitQueue(Queue &Q)//初始化循环队列Q {

}

int EmptyQueue(Queue Q)//判断队列是否为空,空返回1,否则返回0 {

}

void EnQueue(Queue &Q , BTreeNode * item)//进队列

{

if((Q.rear+1)%Q.MaxSize==Q.front)//空间不足,扩大2倍

{

} int k=sizeof(BTreeNode *);

Q.queue=(BTreeNode **)realloc(Q.queue,2*Q.MaxSize*k);

if(Q.rear!=Q.MaxSize-1)

{

//移动队列内容,必须要做

}

Q.MaxSize=2*Q.MaxSize;

//修改队列最大空间

for(int i=0;i

Q.queue[i+Q.MaxSize]=Q.queue[i];

Q.rear=Q.rear+Q.MaxSize;

return Q.rear==Q.front;Q.MaxSize=20;

Q.queue =(BTreeNode **)malloc(Q.MaxSize*sizeof(BTreeNode *));

Q.rear=Q.front =0;BTreeNode **queue;

int MaxSize;

//队列最大存储数

int front;

//头指针,若队列不空,指向队列头元素的前一个位置

int rear;

//尾指针,若队列不空,指向队列尾元素

return S.stack[S.top];

}

Q.rear=(Q.rear+1)%Q.MaxSize;

//元素入队

Q.queue[Q.rear]=item;

BTreeNode * OutQueue(Queue &Q){

if(Q.rear==Q.front)

{

} printf(“队列已空无数据元素出队列!n”);

exit(1);

//先修改front位置,后取走元素

}

/*—————————————---—树的操作————————————*/ //初始化二叉树BT

void InitBTree(BTreeNode *&BT){

} //根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构

void CreateBTree(BTreeNode *&BT, char *a){

Stack s;//堆栈

BTreeNode *p, *t;

//p指向新申请的结点,t指向栈顶结点

int k, i=0;

//k=1表示将处理左子树,k=2表示处理右子树

BT=NULL;

InitStack(s);//初始化堆栈

while(a[i])//一个个读入字符进行处理直到读到''为止

{

switch(a[i])

{

case ' ':

break;

case '(':

Push(s, p);k=1;break;

BT=NULL;Q.front =(Q.front +1)% Q.MaxSize;

return Q.queue[Q.front];

case ')':

Pop(s);break;

case ',':

k=2;break;

default:

//只可能是字符,即结点值

p =(BTreeNode *)malloc(sizeof(BTreeNode));

p->data = a[i];

p->lchild = p->rchild = NULL;

if(BT== NULL)

BT = p;

else

}

}

}

{

}

t = Peek(s);if(k==1)

t->lchild = p;

else

t->rchild = p;

i++;

//检查二叉树BT是否为空,空返回1,否则返回0

int EmptyBTree(BTreeNode *BT){

} //求二叉树BT的深度并返回该值

int DepthBTree(BTreeNode *BT)

{

} //查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0 int FindBTree(BTreeNode *BT, ElemType x){

if(BT==NULL)

return 0;if(BT==NULL)

//空树深度为0

return 0;

return BT==NULL;

else

{

} int dep1=DepthBTree(BT->lchild);

//先求根结点左子树的深度

int dep2=DepthBTree(BT->rchild);//再求根结点右子树的深度

if(dep1>dep2)

//返回最大值,并加上根结点这一层

else return dep2+1;

return dep1+1;

else

{

if(BT->data==x)return 1;

else

{

if(FindBTree(BT->lchild,x))return 1;

if(FindBTree(BT->rchild,x))return 1;

}

} } return 0;

//先序遍历二叉树BT

void PreOrder(BTreeNode *BT)

{

}

//中序遍历二叉树BT

void InOrder(BTreeNode *BT)

{

if(BT)

{ if(BT){

} coutdata

PreOrder(BT->lchild);

//先序遍历左子树

PreOrder(BT->rchild);

//先序遍历右子树

InOrder(BT->lchild);

//中序遍历左子树

}

//后序遍历二叉树BT

void PostOrder(BTreeNode *BT)

{

}

//输出二叉树BT

void PrintBTree(BTreeNode *BT)

{

if(BT)

//树非空

{

coutdata;//输出根结点

if(BT->lchild!= NULL || BT->rchild!= NULL)//若非叶子结点,则递归调用输出左右子树

{ if(BT){

} PostOrder(BT->lchild);

//后序遍历左子树

PostOrder(BT->rchild);

//后序遍历右子树

coutdata

//访问根结点

}

coutdata

InOrder(BT->rchild);

//中序遍历右子树

}

}

} cout

PrintBTree(BT->lchild);

if(BT->rchild!= NULL)

{

}

cout

cout

PrintBTree(BT->rchild);

//清除二叉树BT void ClearBTree(BTreeNode *&BT)

{

if(BT){

ClearBTree(BT->lchild);//先递归删除左子树

ClearBTree(BT->rchild);//再递归删除右子树

free(BT);//最后释放根结点

BT=NULL;//根指针为空

}

/*——————————————附加的操作—————————————————*/ //按层次遍历二叉树BT

void LevelOrder(BTreeNode *BT)

//按层次遍历: 利用队列, 每次访问队头结点,一旦访问某结点,它的左右孩子入队列,该结点出队列

{

Queue q;// 定义一个队列

InitQueue(q);// 初始化队列

if(BT)// 树不空

{

} EnQueue(q,BT);// 根结点入队

while(!EmptyQueue(q))// 队列不空 {

} BT = OutQueue(q);// 出队

coutdata

if(BT->lchild!= NULL)

EnQueue(q, BT->lchild);

}

if(BT->rchild!= NULL)

EnQueue(q, BT->rchild);

}

int Get_Sub_Depth(BTreeNode *BT , ElemType x){

} int m,n;if(BT){

} else{

} return 0;if(BT->data==x)

else {

} m=Get_Sub_Depth(BT->lchild,x);n=Get_Sub_Depth(BT->rchild,x);return m>n?m:n;return DepthBTree(BT);/*--------------------实验11要求的操作-*/ //非递归中序遍历二叉树BT

void In_Order2(BTreeNode *BT){

}

//将二叉树中的所有结点的左右子树进行交换

void ChangeBTree(BTreeNode *BT){ Stack s;

BTreeNode *p=BT;

InitStack(s);

// 初始化堆栈

while(p!=NULL ||!EmptyStack(s))

{

} if(p)

{

}

else

{

} p=Pop(s);

coutdata

p=p->rchild;

Push(s, p);

p=p->lchild;

} BTreeNode *p;

if(BT)

{

} p=BT->lchild;

BT->lchild=BT->rchild;

BT->rchild=p;

ChangeBTree(BT->lchild);//递归交换左子树

ChangeBTree(BT->rchild);//递归交换右子树

//统计二叉树中的所有结点数

int CountBTree(BTreeNode *BT){

}

//复制一棵二叉树,并返回复制得到的二叉树根结点指针

BTreeNode *CopyBTree(BTreeNode *BT){

BTreeNode *p;

if(BT)

{ if(!BT)return 0;else

if(BT->lchild==NULL&&BT->rchild==NULL)

else return CountBTree(BT->lchild)+CountBTree(BT->rchild)+1;return 1;

p=(BTreeNode *)malloc(sizeof(BTreeNode));

}

//如果两棵二叉树具有相同的树型,则称它们是相似的 int SimilarTrees(BTreeNode *BT1,BTreeNode *BT2){

int like1,like2;

if(BT1==NULL && BT2==NULL)

return 1;

}

else return NULL;p->data=BT->data;

p->lchild=CopyBTree(BT->lchild);

p->rchild=CopyBTree(BT->rchild);

return p;

}

else

if(BT1==NULL || BT2==NULL)

return 0;

else

{

} like1=SimilarTrees(BT1->lchild,BT2->lchild);//判断左子树是否相似

like2=SimilarTrees(BT1->rchild,BT2->rchild);//判断右子树是否相似

return

like1&&like2;

//摘除一棵二叉树上的所有叶子结点后返回一棵新的二叉树

BTreeNode * RemoveLeaves(BTreeNode *BT1){

} if(BT1==NULL)

return NULL;else

if(BT1->lchild==NULL&&BT1->rchild==NULL)

{

}

else

{

} BT1->lchild=RemoveLeaves(BT1->lchild);//检查左子树

BT1->rchild=RemoveLeaves(BT1->rchild);//检查右子树

free(BT1);

return NULL;

return BT1;

《浙大城院数据结构report11.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
浙大城院数据结构report11
点击下载文档
相关专题 浙大城院 数据结构 浙大 浙大城院 数据结构 浙大
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文