二叉排序树的查找性能(Java语言)

简介: 二叉排序树的查找性能(Java语言)

问题描述:

对给定查找集合建立一颗二叉查找树,考查在二叉排序树中进行查找的最好情况、最坏情况和平均情况。

基本要求:

  • 对给定的同一个查找集合,按升序和随机顺序建立两颗二叉排序树
  • 比较同一个待查值在不同二叉排序树上进行查找的比较次数
  • 对随机顺序建立的二叉排序树,输出查找的最好情况、最坏情况和平均情况。

以下代码仅供参考

以下代码仅供参考

以下代码仅供参考

/**
 *作者:魏宝航
 *2020年11月29日,下午20:20
 */
import java.util.*;
public class Main {
  public static int searchCount=0;
  public static void main(String[] args) {
    int[] arr1 = new int[] { 4, 7, 3, 2, 5, 12, 14, 23, 34, 21 };
    int[] arr2 =Arrays.copyOf(arr1, arr1.length);
    Arrays.sort(arr2);
    binarySortTree tree1 = new binarySortTree();
    binarySortTree tree2 = new binarySortTree();
    for (int i = 0; i < arr1.length; i++) {
      tree1.add(arr1[i]);
      tree2.add(arr2[i]);
    }
    levelOrder(tree1.root);
    levelOrder(tree2.root);
    search(tree1.root, 5);
    System.out.println("随机顺序二叉树查找次数:"+searchCount);
    searchCount=0;
    search(tree2.root, 5);
    System.out.println("升序二叉树查找次数:"+searchCount);
  }
  public static void levelOrder(Node root)
  {
    Queue<Node> list=new LinkedList<Node>();
    list.add(root);
    System.out.print("层序遍历:");
    while(!list.isEmpty())
    {
      Node temp=list.poll();
      System.out.print(temp+" ");
      if(temp.left!=null)
      {
        list.add(temp.left);
      }
      if(temp.right!=null)
      {
        list.add(temp.right);
      }
    }
    System.out.println();
  }
  public static void search(Node root,int key) {
    searchCount++;
    if(root==null) {
      return;
    }
    if(root.val==key) {
      return;
    }
    if(root.val<key) {
      search(root.right, key);
    }
    if(root.val>key) {
      search(root.left, key);
    } 
  }
}
class binarySortTree {
  Node root;
  int size;
  public binarySortTree() {
  }
  void add(int val) {
    if (root == null) {
      root = new Node(val, null);
      size++;
      return;
    }
    Node parent = root;
    Node temp = root;
    int cmp = 0;
    while (temp != null) {
      parent = temp;
      if (val < temp.val) {
        temp = temp.left;
        cmp = -1;
      } else if (val > temp.val) {
        temp = temp.right;
        cmp = 1;
      } else {
        return;
      }
    }
    if (cmp < 0) {
      parent.left = new Node(val, parent);
    } else {
      parent.right = new Node(val, parent);
    }
    size++;
  }
}
class Node {
  int val;
  Node left;
  Node right;
  Node parent;
  Node(int val, Node parent) {
    this.val = val;
    this.parent = parent;
  }
  Node(int val) {
    this.val = val;
  }
  public String toString() {
    return val + " ";
  }
}


目录
相关文章
|
4月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
204 4
|
4月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
372 18
|
4月前
|
存储 缓存 Java
Java 12相比Java 11有哪些性能上的提升?
Java 12相比Java 11有哪些性能上的提升?
149 3
|
4月前
|
Java 测试技术 API
Java Stream API:被低估的性能陷阱与优化技巧
Java Stream API:被低估的性能陷阱与优化技巧
422 114
|
4月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
311 8
|
5月前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
317 6
|
5月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
263 15
|
5月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
302 3
|
6月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
297 4
|
6月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
541 0