数据结构Java(一)实验五 二叉树建立及应用

一、实验目的

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.报告最后包含实验总结和体会。

六、对综合性实验的说明

      实验五是一个综合性的实验,实验中的数据元素采用二叉链表作为存储结构。该实验要求学生完成建树、遍历、统计叶子结点等多项要求,集成了树、二叉链表、栈、递归和非递归调用等多个知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小孙同学1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值