java数据结构折半查找和二叉排序树

文中内容来源于《数据结构 --Java语言描述》(第二版) 刘小晶 杜选 主编
此系列文章作为学校实验记录,若文中内容有误,请大家指出,谢谢

一、实验目的

1、掌握查找的特点。
2、掌握折半查找的基本思想及其算法。
3、熟悉二叉排序树的特点,掌握二叉排序树的插入、删除操作。

二、实验内容

1、设有关键字序列k={ 5 ,14 ,18 ,21 ,23 ,29 ,31 ,35 },查找key=21和key=25的数据元素。
2、根据关键字序列{45、24、53、12、37、93}构造二叉排序树,并完成插入13删除关键字53和24的操作。

三、实验步骤

1、折半查找
(1)从键盘输入上述8个整数5 ,14 ,18 ,21 ,23 ,29 ,31 ,35,存放在数组bub[8]中,并输出其值。
(2)从键盘输入21,查找是否存在该数据元素,若存在,则输出该数据元素在表中的位置,否则给出查找失败的信息。
(3)从键盘输入25,查找是否存在该数据元素,若存在,则输出该数据元素在表中位置,否则给出查找失败的信息。
2、二叉排序树
(1)二叉排序树存储定义
(2)从键盘上输入六个整数45、24、53、12、37、9构造二叉排序树
(3)输出其中序遍历结果。
(4)插入数据元素13,输出其中序遍历结果。
(5)删除数据元素24和53,输出其中序遍历结果。

源代码

//顺序表记录结点类
package ch7;
public class ElementType {
   
    public Object data;

    public ElementType(Object data) {
   
        this.data = data;
    }
    public ElementType() {
   
    }
    public String toString() {
   
        return (String)data;
    }
}


//顺序表记录关键字类
package ch7;
public class KeyType implements Comparable<KeyType> {
   
    public int key;
    public KeyType() {
   

    }
    public KeyType(int key) {
   
        this.key = key;
    }
    public String toString() {
   
        return key + "";
    }
    //覆盖Comparable接口中比较关键字大小的方法
    public int compareTo(KeyType another) {
   
        int thisVal = this.key;
        int anotherVal = another.key;
        if(thisVal<anotherVal) {
   
            return -1;
        } else {
   
            if(thisVal == anotherVal) {
   
                return 0;
            } else {
   
                return 1;
            }
        }
    }
}


//待排序的顺序表记录类
package ch7;
public class RecordNode {
   
    public Comparable key;
    public Object element;
    public RecordNode(Comparable key) {
   
        this.key = key;
    }
    public RecordNode(Comparable key,Object element) {
   
        this.key = key;
        this.element = element;
    }
    public String toString() {
   
        return "[" + key + "]";
    }
}


//待排序的顺序表类
package ch7;
import java.util.Scanner;
public class SeqList {
   
    public RecordNode[] r;//顺序表记录结点数组
    public int curlen;//顺序表长度,即记录个数
    //顺序表的构造方法,构造一个存储空间容量为maxSize的顺序表
    public SeqList(int maxSize) {
   
        this.r = new RecordNode[maxSize];
        this.curlen = 0;
    }
    //在当前顺序表的第i个结点之前插入一个RecordNode类型的结点x
    public void insert(int i,RecordNode x) throws Exception{
   
        if(curlen == r.length) {
   
            throw new Exception("顺序表已满!");
        }
        if(i<0 || i>curlen) {
   
            throw new Exception("插入位置不合法!");
        }
        for (int j = curlen; j > i; j--) {
   
            r[j] = r[j - 1];//插入位置及之后的数据元素后移
        }
        r[i] = x;//插入x
        this.curlen++;//表长度增1
    }
/*
二分查找的递归写法
public int binarySearchDG(int low,int high,Comparable key) {
    int mid;
    if(low<=high) {
        mid = low + high;
        if(r[mid].key.compareTo(key)>0) {
            return binarySearchDG(low,mid - 1,key);
        } else if(r[mid].key.compareTo(key)<0) {
            return binarySearchDG(mid + 1,high,key);
        } else {
            return mid;
        }
    }
    return -1;
}
*/

    public int binarySearch(Comparable key) {
   
        if(curlen>0) {
   
            int low = 0,high = curlen - 1;//查找范围上下界
            while(low<=high) 
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章概论 自测题答案 一、填空题 1. 数据结构是一门研究非数值计算的程序设计问题计算机的 操作对象 以及它们之间的 关系 和运算等的学科。 2. 数据结构被形式地定义为(D, R),其D是 数据元素 的有限集合,R是D上的 关系 有限集合。 3. 数据结构包括数据的 逻辑结构 、数据的 存储结构 和数据的 运算 这三个方面的内容。 4. 数据结构按逻辑结构可分为两大类,它们分别是 线性结构 和 非线性结构 。 ....... 第2章 自测卷答案 一、填空 1. 【严题集2.2①】在顺序表插入或删除一个元素,需要平均移动 表一半元素,具体移动的元素个数与 表长和该元素在表的位置 有关。 2. 线性表结点的集合是 有限 的,结点间的关系是 一对一 的。 3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动 n-i+1 个元素。 4. 向一个长度为n的向量删除第i个元素(1≤i≤n)时,需向前移动 n-i 个元素。 5. 在顺序表访问任意一结点的时间复杂度均为 O(1) ,因此,顺序表也称为 随机存取 的数据结构。 ....... 第8章 查找 自测卷 姓名 班级 一、填空题(每空1分,共10分) 1. 在数据的存放无规律而言的线性表进行检索的最佳方法是 顺序查找(线性查找) 2. 线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表与k相等的元素,在查找不成功的情况下,最多需要检索 8 次。设有100个结点,用二分法查找时,最大比较次数是 7 。 3. 假设在有序线性表a[20]上进行折半查找,则比较一次查找成功的结点数为1;比较两次查找成功的结点数为 2 ;比较四次查找成功的结点数为 8 ;平均查找长度为 3.7 。解: 显然,平均查找长度= O(log 2 n) <5次(2 5 )。但具体是多少次,则不应当按照公式来计算( 即( 21×log 2 21)/20=4.6次并不正确! )。因为这是在假设 n=2 m -1的情况下推导出来的公式。应当用穷举法罗列全部元素的查找次数为=( 1+2×2+4×3+8×4+5×5)=74; ASL=74/20=3.7 !!! 4. 折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表元素20,它将依次与表元素 28. 6. 12 .20 比较大小。 .........

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值