基于二叉排序树的查找

1. 1  问题描述和要求

【问题描述】实现基于二叉排序树的查找。根据提示输入参赛队编号,若查找成功,输出该赛事类别对应的基本信息(参赛作品名称、参赛学校、赛事类别、参赛者和指导老师信息),同时,输出查找成功时平均查找长度ASL;否则,输出查找失败!。请输出ASL(成功)的计算公式和结果值。

1. 2问题分析

二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NULL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。我们需要读入txt文档,然后将参赛队伍用插入的方法插入二叉树,再使用查找方法实现查找操作。

计算平均查找长度,在n个元素的折半查找判定树中,由于关键字序列是用树构建的,所以查找路径实际为树中从根节点到被查结点的一条路径,因为比较次数刚好为该元素在树中的层数。所以Pi为查找k的概率,level(Ki)为k对应内部结点的层次。

数据结构的选择和概要设计

2. 1  数据结构的选择

本问题对于team.txt采用的是String[] 字符串数组,因为本部分仅需对txt文本中本就存在的398条信息进行查询,所以使用了字符串数组,因为字符串其实就是一个字符数字 char[],字符串保存的值在数组中保存,private修饰且不提同gettter和setter方法,无法修改。对于二叉树,则使用了链表

此外,本问题设计到了二叉树,在此介绍一下树和二叉树的概念

树的定义:树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

树的特点:

1.每个结点有零个或多个子结点;

2.没有父结点的结点为根结点;

3.每一个非根结点只有一个父结点;

4.每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;

二叉树

定义:二叉树就是不超过2的树 (每个结点最多有两个子结点)

二叉搜索树是一颗特殊的二叉树:它的左子树的所有节点的值,均小于根节点;它的右子树的所有节点的值,均大于根节点.

2.2  概要设计

2.2.1  概述

本实验的编程语言采用 Java ,具体内容为读入文本文档,构建二叉树并实现基于二叉树的查找以及计算平均查找长度ASL。

2.2.2  模块结构

基本内容主要包括二叉树的插入,二叉树的查找与读入txt文件。根据二叉查找树的性质,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。所以查找操作就相对比较简单,当到达一个结点时,如果值等于待查找的值,则直接返回,如果大于,则去右子树查找,如果小于,则去左子树中查找。在插入与查找中,使用了递归调用的方法。有了上面查找的思路,插入就不难,所以按照搜索的思路,当找到null的时候将节点放在空位置就好了,但是在二叉搜索树中没有相同的节点,所以当有相等的节点出现要放弃插入。此外,我们需要计算ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度。它的定义是这样的:

其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。

  txt文件读入方法

public static void main(String[] args) {

    BinarySearchTree bst = new BinarySearchTree();



    try (BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\lenovo\\IdeaProjects\\" +

            "ComputerSystem\\team.txt"))) {

        String line;

        br.readLine(); // 跳过文件第一行标题行

        while ((line = br.readLine()) != null) {

            String[] data = line.split("#"); // 根据制表符分割数据



            if (data.length == 6) {

                String id = data[0].trim();

                String name = data[1].trim();

                String school = data[2].trim();

                String type = data[3].trim();

                String member = data[4].trim();

                String teacher = data[5].trim();

                Team team = new Team(id, name, school, type, member, teacher);

                bst.insert(team);

            }

        }

    } catch (IOException e) {

        e.printStackTrace();

    }

定义节点内部类

class Node //结点内部类

{

    Team team;

    Node left;//当前结点的左结点

    Node right;//当前结点的右结点



    //返回值:查找到则返回具体节点,否则返回nul

    public Node(Team team) {

        this.team = team;

        this.left = null;

        this.right = null;

    }

}



public class BinarySearchTree {

    private Node root;//根节点

    private int totalNodes;

    //private int totalComparisons;



    public BinarySearchTree() {

        root = null;

        totalNodes = 0;

        //totalComparisons = 0;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值