博客
关于我
2017-2018-1 20162308 实验二 树
阅读量:797 次
发布时间:2023-04-04

本文共 4253 字,大约阅读时间需要 14 分钟。

实验二 报告

一、实验内容概述

本次实验的主要内容包括以下几个方面:

  • 实现LinkedBinaryTree

    • 完成链树LinkedBinaryTree的实现,包括getRight、contains、toString、preorder、postorder等方法。
    • 使用JUnit或自编写驱动类对实现进行测试。
  • 中序先序序列构造二叉树

    • 基于LinkedBinaryTree,实现基于中序、先序序列构造唯一一棵二叉树的功能。
    • 使用递归的方法,从根结点的两边开始构造子树。
  • 决策树

    • 完成PP16.6实验,设计一个猜小动物的诊断树。
  • 表达式树

    • 完成PP16.8实验,实现表达式树的构造与计算功能。
  • 二叉搜索树

    • 完成PP17.1实验,实现二叉搜索树的基本操作方法。
  • 源码分析

    • 参考教材和相关文档,分析Java中的红黑树(TreeMap、HashMap)源码。

  • 二、详细实验内容

    1. 实现LinkedBinaryTree

    本实验的核心是实现一个基于链表的二叉树数据结构。主要完成以下方法:

    • getRight:获取右孩子节点。
    • contains:检查树中是否存在指定节点。
    • toString:生成树的字符串表示。
    • preorder:生成前序遍历结果。
    • postorder:生成后序遍历结果。

    代码实现如下:

    import java.util.*;public class MyLinkedBinaryTree
    implements BinaryTree
    { protected BTNode root; public MyLinkedBinaryTree() { root = null; } public MyLinkedBinaryTree(T element) { root = new BTNode(element); } public MyLinkedBinaryTree(BTNode rootNode) { root = rootNode; } public MyLinkedBinaryTree(T element, MyLinkedBinaryTree
    left, MyLinkedBinaryTree
    right) { root = new BTNode(element); root.setLeft(left.root); root.setRight(right.root); } // ... (其他方法如getLeft、find、size等)}

    2. 中序先序序列构造二叉树

    基于前序和中序序列,使用递归方法构造二叉树。具体实现如下:

    public class exp2 {    final static char[] inorder = "HDIBEMJNAFCKGL".toCharArray();    final static char[] preorder = "ABDHIEJMNCFGKL".toCharArray();    public static void main(String[] args) {        MyLinkedBinaryTree root = new MyLinkedBinaryTree(genetree(preorder, inorder));        System.out.println(root);    }    public static BTNode genetree(char[] pre, char[] in) {        HashMap map = geneMap(in);        return preIn(pre, 0, pre.length - 1, in, 0, in.length - 1, map);    }    public static HashMap geneMap(char[] charArray) {        HashMap temp = new HashMap();        for (int i = 0; i < charArray.length; i++) {            temp.put(charArray[i], i);        }        return temp;    }    public static BTNode preIn(char[] pre, int preIndex, int preJ, char[] in, int inIndex, int inJ, HashMap map) {        if (preIndex > preJ) return null;        BTNode head = new BTNode(pre[preIndex]);        int index = map.get(pre[preIndex]);        head.left = preIn(pre, preIndex + 1, preIndex + index - inIndex, in, inIndex, index - 1, map);        head.right = preIn(pre, preIndex + index - inIndex + 1, preJ, in, index + 1, inJ, map);        return head;    }}

    3. 决策树

    完成PP16.6实验,设计一个诊断小动物的二叉树。树的结构如下:

    public class BackPainExpert {    private MyLinkedBinaryTree tree;    public BackPainExpert() {        // ... (树的初始化代码)    public void diagnose() {        Scanner scan = new Scanner(System.in);        MyLinkedBinaryTree current = tree;        while (current.size() > 1) {            System.out.println(current.getRootElement());            String answer = scan.nextLine().equalsIgnoreCase("N");            current = current.getLeft();        }        System.out.println(current.getRootElement());    }}

    4. 表达式树

    完成PP16.8实验,实现表达式树的构造与计算。代码实现如下:

    public class ExpressionTree {    private String exp;    private BTNode root;    public void geneTree(String s) {        ArrayList oper = new ArrayList();        for (int i = 0; i < s.length(); i++) {            char c = s.toCharArray()[i];            if (Character.isDigit(c)) {                exp += c + " ";            } else {                oper.add(new BTNode(exp));                exp = "";                oper.add(c + " ");            }        }        // ... (后续代码)    public Integer getResult() {        ArrayList strList = getStringList(toStr());        ArrayList rpn = getRPN(strList);        return calculate(rpn);    }}

    5. 二叉搜索树

    完成PP17.1实验,实现二叉搜索树的基本操作。代码如下:

    public class LinkedBinarySearchTree
    > extends MyLinkedBinaryTree
    { public void add(T item) { if (root == null) { root = new BSTNode(item); } else { ((BSTNode) root).add(item); } }

    6. 源码分析

    参考教材和相关文档,分析TreeMap的源码。主要分析put和getEntry方法:

    public V put(K key, V value) {    TreeMapEntry t = root;    // ... (完整代码)}public V get(Object key) {    Entry p = getEntry(key);    return (p == null ? null : p.value);}

    三、总结与展望

    本次实验主要完成了多个与二叉树相关的开发任务,包括数据结构实现、算法设计、树的构造与分析等内容。通过本次实验,我对Java高级数据结构的实现有了更深入的理解,也掌握了二叉树在实际应用中的构造与操作方法。未来,我将继续深入学习Java集合框架的源码分析,进一步提升自身的技术能力。

    转载地址:http://gsrfk.baihongyu.com/

    你可能感兴趣的文章
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>