二叉树实验报告.docx
- 文档编号:28565404
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:26
- 大小:253.10KB
二叉树实验报告.docx
《二叉树实验报告.docx》由会员分享,可在线阅读,更多相关《二叉树实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
二叉树实验报告
重庆交通大学
综合性设计性实验报告
班级:
软件开发专业2010级一班
实验项目名称:
二叉树
实验项目性质:
设计性实验
实验所属课程:
数据结构
实验室(中心):
6教
指导教师:
鲁云平
实验完成时间:
2012年4月29日
1、实验目的
主要完成以下功能:
1.建立二叉树
2.计算结点所在的层次
3.统计结点数量和叶结点数量
4.计算二叉树的高度
5.计算结点的度
6.找结点的双亲和子女
7.二叉树的遍历
8.二叉树的输出等等
2、实验内容及要求
1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定
2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同
3.将实验报告电子版和源代码在网络教学平台提交
3、实验设备及软件
Visualstudio2010
四、设计方案
㈠题目(老师给定或学生自定)
二叉树的简单应用
㈡设计的主要思路
通过递归原理实现大部分遍历二叉树功能
㈢主要功能
1.建立二叉树
2.计算结点所在的层次
3.统计结点数量和叶结点数量
4.计算二叉树的高度
5.计算结点的度
6.找结点的双亲和子女
7.二叉树的遍历
8.二叉树的输出
5、主要代码
栈头文件:
stack.h
classStack
{
public:
Stack(intsz=100);
~Stack(){delete[]elements;}
voidPush(constT&x);
boolPop(T&x);
boolgetTop(T&x);
boolIsEmpty()const{return(top==-1)?
true:
false;}
boolIsFull()const{return(top==maxSize-1)?
true:
false;}
private:
T*elements;
inttop;
intmaxSize;
voidoverflowProcess();
};
template
Stack
:
Stack(intsz):
top(-1),maxSize(sz)
{
elements=newT[maxSize];
assert(elements!
=NULL);
};
template
voidStack
:
overflowProcess()
{
T*newArray=newT[maxSize+stackIncreament];
if(newArray=NULL){cerr<<"存储分配失败!
"< (1);} for(inti=0;i<=top;i++) newArray[i]=elements[i]; maxSize=maxSize+stackIncreament; delete[]elements; elements=newArray; }; template voidStack : Push(constT&x) { if(IsFull()==true)overflowProcess(); elements[++top]=x; }; template boolStack : Pop(T&x) { if(IsEmpty()==true)returnfalse; x=elements[top--]; returntrue; }; template boolStack : getTop(T&x) { if(IsEmpty()==true)returnfalse; x=elements[top]; returntrue; }; 二叉树头文件 tree.h #include #include"stack.h" #include #include usingnamespacestd; template structBinTreeNode { Tdata; BinTreeNode BinTreeNode(): leftChild(NULL),rightChild(NULL){} BinTreeNode(Tx,BinTreeNode data(x),leftChild(l),rightChild(r){} }; template classBinaryTree { public: BinTreeNode BinTreeNode TRefValue;//数据输入停止标志 BinaryTree(): root(NULL){}//构造函数 BinaryTree(Tvalue): RefValue(value),root(NULL){}//构造函数 BinaryTree(BinaryTree ~BinaryTree(){destroy(root);}//析构函数 boolIsEmpty(){return(root==NULL)? true: false;}//判断二叉树空否 BinTreeNode {return(root==NULL||root==current)? NULL: Parent(root,current);} BinTreeNode {return(current! =NULL)? current->leftChild: NULL;} BinTreeNode {return(current! =NULL)? current->rightChild: NULL;} intHeight(){returnHeight(root);}//返回树高度 intSize(){returnSize(root);}//返回结点数 BinTreeNode voidpreOrder(void(*visit)(BinTreeNode {preOrder(root,visit);} voidCreateBinTree_one(ifstream&in,BinTreeNode voidCreateBinTree_two(ifstream&in,BinTreeNode voiddestroy(BinTreeNode intHeight(BinTreeNode intSize(BinTreeNode voidLeaf(BinTreeNode BinTreeNode voidTraverse(BinTreeNode voiddegree(BinTreeNode voidlevel(BinTreeNode voidSearch(BinTreeNode voidPrintBTree(BinTreeNode voidperOrder(BinTreeNode }; template voidBinaryTree : destroy(BinTreeNode { if(subTree! =NULL) { destroy(subTree->leftChild); destroy(subTree->rightChild); deletesubTree; } } template voidBinaryTree : CreateBinTree_one(ifstream&in,BinTreeNode { Stack BT=NULL; BinTreeNode charch; in>>ch; while(ch! ='#') { switch(ch) { case'(': s.Push(p);k=1;break; case')': s.Pop(t);break; case',': k=2;break; default: p=newBinTreeNode if(BT==NULL) BT=p; elseif(k==1) {s.getTop(t);t->leftChild=p;} else {s.getTop(t);t->rightChild=p;} } in>>ch; } } template voidBinaryTree : CreateBinTree_two(ifstream&in,BinTreeNode { subTree=NULL; Titem; if(! in.eof()) { in>>item; if(item! ='#') { subTree=newBinTreeNode if(subTree==NULL) {cerr<<"存储分配错! "< (1);} CreateBinTree_two(in,subTree->leftChild); CreateBinTree_two(in,subTree->rightChild); } else subTree=NULL; } } template BinTreeNode : Parent(BinTreeNode { if(subTree==NULL) returnNULL; if(subTree->leftChild==current||subTree->rightChild==current) returnsubTree; BinTreeNode if((p=Parent(subTree->leftChild,current))! =NULL) returnp; else returnParent(subTree->rightChild,current); } template voidBinaryTree : Traverse(BinTreeNode { if(subTree! =NULL) { cout< Traverse(subTree->leftChild); Traverse(subTree->rightChild); } } template voidBinaryTree : perOrder(BinTreeNode { if(subTree! =NULL) { visit(subTree); PreOrder(subTree->leftChild,visit); PreOrder(subTree->rightChild,visit); } } template intBinaryTree : Size(BinTreeNode { if(subTree==NULL) return0; else return1+Size(subTree->leftChild)+Size(subTree->rightChild); } template intBinaryTree : Height(BinTreeNode { if(subTree==NULL) return0; else { inti=Height(subTree->leftChild); intj=Height(subTree->rightChild); return(i j+1: i+1; } } template voidBinaryTree : Leaf(BinTreeNode { if(subTree! =NULL) { if(subTree->leftChild==NULL&&subTree->rightChild==NULL) x++; Leaf(subTree->leftChild,x); Leaf(subTree->rightChild,x); } } template voidBinaryTree : PrintBTree(BinTreeNode { if(subTree! =NULL) { cout< if(subTree->leftChild! =NULL||subTree->rightChild! =NULL) { cout<<'('; PrintBTree(subTree->leftChild); cout<<','; if(subTree->rightChild! =NULL) PrintBTree(subTree->rightChild); cout<<')'; } } } template voidBinaryTree : Search(BinTreeNode { if(subTree==NULL) return; if(subTree->data==x) { cout<<"此字符没有父结点! "< if(subTree->leftChild! =NULL) cout<<"此字符的左子女为: "< else cout<<"此字符没有左子女! "<<""; if(subTree->rightChild! =NULL) cout<<"此字符的右子女为: "< else cout<<"此字符没有右子女! "< return; } if(subTree->leftChild! =NULL) { if(subTree->leftChild->data==x) { if(subTree! =NULL) cout<<"此字符的父结点为: "< if(subTree->leftChild->leftChild! =NULL) cout<<"此字符的左子女结点为: "< else cout<<"此字符没有左子女结点! "<<""; if(subTree->leftChild->rightChild! =NULL) cout<<"此字符的右子女结点为: "< else cout<<"此字符没有右子女结点! "< return; } } if(subTree->rightChild! =NULL) { if(subTree->rightChild->data==x) { if(subTree! =NULL) cout<<"此字符的父结点为: "< if(subTree->rightChild->leftChild! =NULL) cout<<"此字符的左子女结点为: "< else cout<<"此字符没有左子女结点! "<<""; if(subTree->rightChild->rightChild! =NULL) cout<<"此字符的右子女结点为: "< else cout<<"此字符没有右子女结点! "< return; } } if(subTree! =NULL) { Search(subTree->leftChild,x); Search(subTree->rightChild,x); } } template voidBinaryTree : degree(BinTreeNode { if(subTree==NULL) return; if(subTree->data==x) { if(subTree->leftChild! =NULL&&subTree->rightChild! =NULL) cout<<"此结点的度为: 2"< elseif(subTree->leftChild! =NULL||subTree->rightChild! =NULL) cout<<"此结点的度为: 1"< else cout<<"此结点的度为: 0"< return; } if(subTree! =NULL) { degree(subTree->leftChild,x); degree(subTree->rightChild,x); } } template voidBinaryTree : level(BinTreeNode { if(subTree! =NULL) { if(subTree->data==x) cout<<"此结点的层次为: "< if(subTree->data! =x) { y++; level(subTree->leftChild,x,y); } if(subTree->data! =x) { level(subTree->rightChild,x,y); y--; } } } 主函数 #include #include #include #include #include"tree.h" usingnamespacestd; classtree { private: BinaryTree public: voidmenu(); voidcreat(); }; voidtree: : menu() { treeTr; charp; cout<<"_____________________________________________"< cout<<"|是否建立一个二叉树? |"< cout<<"|点Y确认建立,点N退出|"< cout<<"---------------------------------------------"< first: cin>>p; switch(p) { case'y': Tr.creat();break; case'Y': Tr.creat();break; case'N': return;break; case'n': return;break; default: {cout<<"输入无效符号请重新输入: "< } } voidtree: : creat() { treeCJ; intQ; ifstreamin; zero: cout<<"___________________"< cout<<"|请输入建立方式: |"< cout<<"|1.用广义表输入|"< cout<<"|2.用遍历输入|"< cout<<"|3.返回|"< cout<<"-------------------"< first: inti;cin>>i; switch(i) { case1: { i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 实验 报告