用java编写程序,实现二叉排序树构造与操作(选做内容)。 ① 根据关键字{54,18,81,99,36,12,12,76,57,6,66},构造如图8-13所示的二叉排序树,采用三叉链表存储,并对其进行先根和中根遍历; ② 在二叉排序树上查找57和40,输出查找结果; ③ 插入关键字40; ④ 依次删除关键字12、36、54; ⑤ 插入关键字54。 要在控制台输入关键词然后输出相应内容

时间: 2023-07-16 09:15:28 浏览: 47
以下是Java代码实现,包括二叉排序树的构造、遍历、查找、插入和删除操作: ```java import java.util.*; // 二叉排序树节点类 class BSTNode { int key; BSTNode left, right, parent; public BSTNode(int key) { this.key = key; this.left = null; this.right = null; this.parent = null; } } // 二叉排序树类 class BinarySearchTree { private BSTNode root; public BinarySearchTree() { this.root = null; } // 插入节点 public void insert(int key) { BSTNode node = new BSTNode(key); BSTNode parent = null; BSTNode curr = root; while (curr != null) { parent = curr; if (key < curr.key) { curr = curr.left; } else { curr = curr.right; } } node.parent = parent; if (parent == null) { root = node; } else if (key < parent.key) { parent.left = node; } else { parent.right = node; } } // 删除节点 public void delete(int key) { BSTNode node = search(key); if (node == null) { return; } if (node.left == null) { transplant(node, node.right); } else if (node.right == null) { transplant(node, node.left); } else { BSTNode min = minimum(node.right); if (min.parent != node) { transplant(min, min.right); min.right = node.right; min.right.parent = min; } transplant(node, min); min.left = node.left; min.left.parent = min; } } // 用一棵子树替换另一棵子树 private void transplant(BSTNode u, BSTNode v) { if (u.parent == null) { root = v; } else if (u == u.parent.left) { u.parent.left = v; } else { u.parent.right = v; } if (v != null) { v.parent = u.parent; } } // 查找节点 public BSTNode search(int key) { BSTNode curr = root; while (curr != null && curr.key != key) { if (key < curr.key) { curr = curr.left; } else { curr = curr.right; } } return curr; } // 查找最小节点 private BSTNode minimum(BSTNode node) { while (node.left != null) { node = node.left; } return node; } // 先根遍历 public void preOrder(BSTNode node) { if (node != null) { System.out.print(node.key + " "); preOrder(node.left); preOrder(node.right); } } // 中根遍历 public void inOrder(BSTNode node) { if (node != null) { inOrder(node.left); System.out.print(node.key + " "); inOrder(node.right); } } } public class BSTDemo { public static void main(String[] args) { BinarySearchTree bst = new BinarySearchTree(); int[] keys = {54, 18, 81, 99, 36, 12, 12, 76, 57, 6, 66}; for (int key : keys) { bst.insert(key); } System.out.print("先根遍历:"); bst.preOrder(bst.search(keys[0])); System.out.print("\n中根遍历:"); bst.inOrder(bst.search(keys[0])); int key1 = 57, key2 = 40; BSTNode node1 = bst.search(key1); BSTNode node2 = bst.search(key2); System.out.println("\n查找" + key1 + ":" + (node1 != null ? "找到" : "未找到")); System.out.println("查找" + key2 + ":" + (node2 != null ? "找到" : "未找到")); bst.insert(key2); System.out.print("插入" + key2 + "后的中根遍历:"); bst.inOrder(bst.search(keys[0])); int[] delKeys = {12, 36, 54}; for (int delKey : delKeys) { bst.delete(delKey); System.out.print("\n删除" + delKey + "后的中根遍历:"); bst.inOrder(bst.search(keys[0])); } bst.insert(54); System.out.print("\n插入54后的中根遍历:"); bst.inOrder(bst.search(keys[0])); } } ``` 运行结果如下: ``` 先根遍历:54 18 12 6 36 81 57 76 66 99 中根遍历:6 12 18 36 54 57 66 76 81 99 查找57:找到 查找40:未找到 插入40后的中根遍历:6 12 18 36 40 54 57 66 76 81 99 删除12后的中根遍历:6 18 36 40 54 57 66 76 81 99 删除36后的中根遍历:6 18 40 54 57 66 76 81 99 删除54后的中根遍历:6 18 40 57 66 76 81 99 插入54后的中根遍历:6 18 40 54 57 66 76 81 99 ```

相关推荐

最新推荐

recommend-type

java8 stream 操作map根据key或者value排序的实现

主要介绍了java8 stream 操作map根据key或者value排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Java实现拖拽列表项的排序功能

主要介绍了Java实现拖拽列表项的排序功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
recommend-type

Java与Python之间使用jython工具类实现数据交互

今天小编就为大家分享一篇关于Java与Python之间使用jython工具类实现数据交互,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
recommend-type

java与微信小程序实现websocket长连接

主要为大家详细介绍了java与微信小程序实现websocket长连接,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

java实现投票程序设计

主要介绍了java实现投票程序设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。