一、实验目的
1. 建立二叉树
2. 计算结点所在的层次
3.统计结点数量和叶结点数量
4.计算二叉树的高度
5.计算结点的度
6.找结点的双亲和子女
7.二叉树的遍历
8.二叉树的输出等等
二、实验内容及要求
1.二叉树的结点结构,二叉树的存储结构由学生自由选择和设定
2.实验完成后上交打印的实验报告,报告内容与前面所给定的实验模板相同
3.将实验报告电子版和源代码在网络教学平台提交
三、实验设备及软件
VISUAL C++软件
四、设计方案
㈠ 题目(老师给定或学生自定)
二叉树的应用
㈡ 设计的主要思路
本实验在 Microsoft Visual C++ 6.0 中运行,定义树结点,用结构体存储,在其中定义结
点的数据域 data,以及结点左右子女结点指针*leftChild, *rightChild,定义结点指针
BTree,
在程序中先声明所要实现功能的函数,其中包括树的创建函数 CreateBinTree(BTree
&T),前序遍历函数 preOrder(BTree T),中序遍历函数 inOrder(BTree T),后续遍历函
数 postOrder(BTree T),树结点统计函数 TreeNodes(BTree T),树叶结点统计函数
LeafNodes(BTree T),树结点度查询函数 TreeNodedu(BTree T,char ch),树结点所在
层 次 的 查 询 函 数 NodeLoc(BTree T,char c,int nodeloc) , 树 高 度 查 询 函 数
Height(BTree T),树双亲结点查询函数 Parent(BTree T,char c),树左子女查询函数
NodeRC(BTree T,char c),树右子女查询函数 NodeLC(BTree T,char c)等等。在声明
过后就要为各个函数添加实现代码,完成各项功能的输出。在主函数中,首先建立树并保
存。随后使用 do-while 语句实现各项功能的重复操作,switch-case 语句实现各个功能
的选择实现。在实现各个功能时调用前面定义的各个函数,实现功能输出。
㈢ 主要功能
实现二叉树的各项操作。
五、主要代码
#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); //递归建
立右子树
}
else
T= 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; //空树高度为 0
else
{
hl = Height (T->leftChild);
hr = Height (T->rightChild);
hm=hl>hr?hl:hr;
return (hm+1);
}
};
BTree Parent(BTree T,char c)