一、实验目的
1.熟悉二叉树的存贮结构及遍历方式,掌握有关算法的实现。
2.能够利用二叉树解决具体问题。
二、实验环境
⒈ 硬件:每个学生需配备计算机一台。操作系统: Windows;
⒉ 软件: Windows操作系统+MYEPLIPS;
三、实验要求及实验内容
⒈ 要求采用二叉链表作为存贮结构,完成二叉树的建立、先序、中序、和后序遍历的操作。其中先序遍历和后序遍历采用递归算法,中序遍历采用非递归算法。在建好的二叉树基础上,统计树中的叶子结点数或层次。
⒉ 输入数据:树中每个结点的数据类型设定为字符型。
3.设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树,求出先序、中序和后序遍历,求该二叉树所有叶子结点总数。
实现程序:
1.二叉树中结点类 BTNode.java
public class BTNode<E> {//二叉树中的节点类
E data;//数据元素
BTNode lchild;//指向左孩子节点
BTNode rchild;//指向右孩子节点
public BTNode() {//默认构造方法
lchild=rchild=null;
}
public BTNode(E d) {//重载构造方法
data=d;
lchild=rchild=null;
}
}
2.二又树类BTreeClass.java
public class BTreeClass {//二叉树类
BTNode<Character>b;//根节点
String bstr;//二叉树的括号表示串
public BTreeClass() {//构造方法
b=null;
}
public void PreOrder1(BTreeClass bt) { //先序遍历的递归算法
PreOrder11(bt.b);
}
private void PreOrder11(BTNode<Character>t) {
if (t!=null) {
System.out.print(t.data+" ");//访问根节点
PreOrder11(t.lchild);//先序遍历的左子树
PreOrder11(t.rchild);//先序遍历的右子树
}
}
public void InOrder1(BTreeClass bt) {//中序遍历的递归算法
InOrder11(bt.b);
}
private void InOrder11(BTNode<Character>t) {
if (t!=null) {
PreOrder11(t.lchild);
System.out.print(t.data+" ");
PreOrder11(t.rchild);
}
}
public void PostOrder1(BTreeClass bt) {//后序遍历的递归算法
PostOrder11(bt.b);
}
private void PostOrder11(BTNode<Character>t) {
if (t!=null) {
PreOrder11(t.lchild);//后序遍历左子数
PreOrder11(t.rchild);//后序遍历右子树
System.out.print(t.data+" ");//访问根节点
}
}
public int Height(BTreeClass bt){//求二叉树高度
return Height(bt.b);
}
private int Height(BTNode<Character>t){
int lchildh,rchildh;
if (t==null){
return 0;
}else {
lchildh = Height(t.lchild);//求左子树的高度
rchildh = Height(t.rchild);//求右子树的高度
return Math.max(lchildh,rchildh)+1;
}
}
public void InOrder2(BTreeClass bt) {//中序遍历的非递归算法
InOrder21(bt.b);
}
private void InOrder21(BTNode<Character>t) {
SqStackClass<BTNode> st=new SqStackClass<BTNode>();
BTNode<Character> p=t;
while(!st.empty()||p!=null) {
while (p!=null) {
st.push(p);
p=p.lchild;
}
if (!st.empty()) {
p=st.pop();
System.out.print(p.data+" ");
p=p.rchild;
}
}
}
static int i; //类变量
public static BTreeClass CreateBT3(String s) {//由序列化序列s创建二叉树:反序列化
BTreeClass bt=new BTreeClass();
i=0;
bt.b=CreateBT31(s);
return bt;
}
private static BTNode<Character> CreateBT31(String s) {
BTNode<Character>t;
char ch;
if (i>=s.length())
return null;
ch=s.charAt(i);i++;
if (ch=='#')
return null;
t=new BTNode<Character>(ch);
t.lchild=CreateBT31(s);
t.rchild=CreateBT31(s);
return t;
}
}
3.测试表泛型类treetest.java
public class treetest {
public static void main(String[] args)
{
BTreeClass aa=new BTreeClass();
String ss="ab.c..de..f..";
aa=aa.CreateBT3(ss);
System.out.println("先序遍历递归法");
aa.PreOrder1(aa);
System.out.println();
System.out.println("中序遍历递归法:");
aa.InOrder2(aa);
System.out.println();
System.out.println("后序遍历递归法 :");
aa.PostOrder1(aa);
System.out.println();
int h = aa.Height(aa);
System.out.println("二叉树的层数"+h);
}
}
运行结果
测试
通过!
五、报告要求
1.报告要求用专门的实验报告纸书写,字迹清晰,格式规范。
2.报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验要求。
3.报告中应书写源程序,且源程序中要有注释。
4.报告中应包含运行结果及结果分析。如调试通过,请注明‘通过’并写出输入的数据及运行结果;如未调试通过或结果不正确,试分析原因。
5.报告最后包含实验总结和体会。
六、对综合性实验的说明
实验五是一个综合性的实验,实验中的数据元素采用二叉链表作为存储结构。该实验要求学生完成建树、遍历、统计叶子结点等多项要求,集成了树、二叉链表、栈、递归和非递归调用等多个知识点。