当前位置:文档之家› 二叉树实验报告及代码

二叉树实验报告及代码

重庆交通大学综合性设计性实验报告姓名姚远学号 631106060113 班级:计信息一班实验项目名称:二叉树实验项目性质:设计性实验实验所属课程:数据结构实验室(中心): 407机房指导教师:鲁云平实验完成时间: 2013 年 5 月 10 日一、实验目的1. 建立二叉树2. 计算结点所在的层次3.统计结点数量和叶结点数量4.计算二叉树的高度5.计算结点的度6.找结点的双亲和子女7.二叉树的遍历8.二叉树的输出等等二、实验内容及要求1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同3.将实验报告电子版和源代码在网络教学平台提交三、实验设备及软件VISUAL C++软件四、设计方案㈠题目(老师给定或学生自定)二叉树的应用㈡设计的主要思路在计算机科学中,二叉树是每个结点最多有两个子树的有序树。

通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。

二叉树常被用作二叉查找树和二叉堆或是二叉排序树。

二叉树的每个结点至多只有二棵子树(不存在出度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

二叉树的第i层至多有2的i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,出度为2的结点数为n2,则n0 =n2 + 1。

㈢主要功能实现二叉树的各项操作。

五、主要代码#include<iostream.h>#include<stdio.h>#include<stdlib.h>typedef struct BinTreeNode //二叉树结点类定义{char data;//数据域BinTreeNode *leftChild, *rightChild; //左子女、右子女链域}*BTree;BinTreeNode *p,*q,*f;int NodeNum,Leaf;int NodeDu,nodeloc=1;void CreateBinTree(BTree &T);void preOrder(BTree T);void inOrder(BTree T);void postOrder(BTree T);int TreeNodes(BTree T);int LeafNodes(BTree T);int TreeNodedu(BTree T,char ch);void NodeLoc(BTree T,char c,int nodeloc);int Height(BTree T);BTree Parent(BTree T,char c);BTree NodeRC(BTree T,char c);BTree NodeLC(BTree T,char c);void CreateBinTree(BTree &T){char item;cin>>item;if ( item!='#' ){T=(BTree )malloc(sizeof(BinTreeNode));T->data=item;if (T == NULL){cerr << "存储分配错误!" << endl;exit (1);}CreateBinTree (T->leftChild);//递归建立左子树CreateBinTree (T->rightChild); //递归建立右子树}elseT= NULL;};void inOrder(BTree T){if (T != NULL){inOrder (T->leftChild); //遍历左子树cout<<T->data<<" ";inOrder (T->rightChild); //遍历右子树}};void preOrder(BTree T){if (T != NULL){cout<<T->data<<" ";preOrder (T->leftChild); //遍历左子树preOrder (T->rightChild); //遍历右子树}};void postOrder(BTree T){if (T != NULL ){postOrder(T->leftChild);//遍历左子树postOrder(T->rightChild);//遍历右子树cout<<T->data<<" ";}};int TreeNodes(BTree T) //利用二叉树后序遍历算法计算二叉树的结点个数{int hl,hr;if(T != NULL){hl=TreeNodes(T->leftChild);hr=TreeNodes(T->rightChild);NodeNum=NodeNum+1;return NodeNum;}};int LeafNodes(BTree T) //利用二叉树后序遍历算法计算二叉树的叶结点个数{if(T != NULL){LeafNodes(T->leftChild);LeafNodes(T->rightChild);if(T->leftChild==NULL&&T->rightChild==NULL)Leaf=Leaf+1;}return Leaf;};int TreeNodedu(BTree T,char ch){if(T==NULL)return NULL;else{if(T->data == ch&&T->leftChild!=NULL&&T->rightChild==NULL) NodeDu=1;else if(T->data == ch&&T->rightChild!=NULL&&T->leftChild==NULL)NodeDu=1;else if(T->data == ch&&T->leftChild!=NULL&&T->rightChild!=NULL)NodeDu=2;else if(T->data == ch&&T->leftChild==NULL&&T->rightChild==NULL)NodeDu=0;TreeNodedu(T->leftChild,ch);TreeNodedu(T->rightChild,ch);return NodeDu;}}void NodeLoc(BTree T,char c,int nodeloc){if(T != NULL){if(T->data == c)cout<<nodeloc<<endl;NodeLoc(T->leftChild,c,nodeloc+1);NodeLoc(T->rightChild,c,nodeloc+1);}};int Height(BTree T) //利用二叉树后序遍历算法计算二叉树的高度{int hl,hr,hm;if(T == NULL)return 0;//空树高度为0else{hl = Height (T->leftChild);hr = Height (T->rightChild);hm=hl>hr?hl:hr;return (hm+1);}BTree Parent(BTree T,char c){BTree p;if (T==NULL) return NULL;if((T->leftChild!=NULL&&T->leftChild->data==c)||(T->rightChild!=NULL&&T->righ tChild->data==c))return T;//找到, 返回父结点地址else{if ((p=Parent(T->leftChild, c))!=NULL)return p; //递归在左子树中搜索elsereturn Parent(T->rightChild, c); //递归在左子树中搜索}return NULL;};BTree NodeLC(BTree T,char c){if(T==NULL)return NULL;else if(T->data == c){if (T->leftChild){return T->leftChild ;}}else{if(NodeLC(T->leftChild,c)!=NULL)return NodeLC(T->leftChild,c);else if(NodeLC(T->rightChild,c)!=NULL) return NodeLC(T->rightChild,c);elsereturn NULL;}}BTree NodeRC(BTree T,char c){if(T==NULL)return NULL;else if(T->data == c){if (T->rightChild){return T->rightChild ;}}else{if(NodeRC(T->leftChild,c)!=NULL)return NodeRC(T->leftChild,c);else if(NodeRC(T->rightChild,c)!=NULL) return NodeRC(T->rightChild,c);elsereturn NULL;}}void main(){BTree T;int nodes,leafnodes,height,nodedu;cout<<"创建二叉树,请输入完全二叉树的先序序列,用'#'代表虚结点:"<<endl;CreateBinTree(T);int i;do{cout<<"****************1:输出前序遍历结果************************"<<endl;cout<<"****************2:输出中序遍历结果************************"<<endl;cout<<"****************3:输出后序遍历结果************************"<<endl;cout<<"****************4:输出二叉树的高度************************"<<endl;cout<<"****************5:输出二叉树的结点数**********************"<<endl;cout<<"****************6:输出二叉树的叶结点数********************"<<endl;cout<<"****************7:输出二叉树任意结点的度数****************"<<endl;cout<<"****************8:输出二叉树任意结点所在层次**************"<<endl;cout<<"****************9:输出二叉树任意结点的双亲结点值**********"<<endl;cout<<"****************10:输出二叉树任意结点的子女结点值*********"<<endl;cout<<"****************11:退出程序*******************************"<<endl;cout<<"请输入要执行的功能代码的编号(1-10):"<<endl;cin>>i;cout<<endl;switch(i){case 1:cout<<"前序遍历结果为:"<<endl;preOrder(T);break;case 2:cout<<"中序遍历结果为:"<<endl;inOrder(T);break;case 3:cout<<"后序遍历结果为:"<<endl;postOrder(T);break;case 4:height=Height(T);cout<<"二叉树的高度为:"<<height<<endl;break;case 5:nodes=TreeNodes(T);cout<<"二叉树的结点数为:"<<nodes<<endl;break;case 6:leafnodes=LeafNodes(T);cout<<"二叉树的叶结点数为:"<<leafnodes<<endl;break;case 7:char ch1;cout<<"请输入该结点的值:";cin>>ch1;nodedu=TreeNodedu(T,ch1);cout<<"该结点的度数为:"<<nodedu<<endl;break;case 8:char ch4;cout<<"请输入该结点的值:";cin>>ch4;cout<<"该结点所在二叉树的层次为:";NodeLoc(T,ch4,1);break;case 9:char ch2;cout<<"请输入该结点的值:";cin>>ch2;f=Parent(T,ch2);if(f!=NULL)cout<<"该结点双亲结点值为:"<<f->data<<endl;elsecout<<"该结点没有父结点。

相关主题