有序二叉树java实现

类实现:

package 树;import java.util.LinkedList;
import java.util.Queue;public class BinaryTree {public TreeNode root;//插入public void insert(int value){//插入成功之后要return结束方法TreeNode node = new TreeNode(value);//如果root为空的话插入if(root == null){root = node;return;}//定义游标遍历二叉树TreeNode index = root;while (true){if(index.value<value){//要插入的节点是大的if(index.right==null){//插入index.right=node;return;}index = index.right;}else {//新插入的值小if(index.left==null){index.left=node;return;}index = index.left;}}}//广度优先搜索,借助队列实现,如果队列不为空的话就让队列头出队,将出队的左右孩子依次进队public void levelOrder(){Queue<TreeNode> queue = new LinkedList<TreeNode>();if(root!=null){queue.add(root);}else {System.out.println("树为空,请先插入数据");}while ((!queue.isEmpty())){TreeNode index = queue.poll();System.out.print(index.value + " ");if(index.left!=null){queue.add(index.left);}if(index.right!=null){queue.add(index.right);}}System.out.println();}//先序遍历public void beforeOrder(TreeNode node){if(node == null){return;}System.out.print(" "+node.value+" ");beforeOrder(node.left);beforeOrder(node.right);}//中序遍历public void inOrder(TreeNode node){if(node == null){return;}inOrder(node.left);System.out.print(" "+node.value+" ");inOrder(node.right);}//后序遍历public void adterOrder(TreeNode node){if(node == null){return;}adterOrder(node.left);adterOrder(node.right);System.out.print(" "+node.value+" ");}//查找public TreeNode seach(int value){if(root==null){return null;}//如果不是空的话,定义一个游标,指向根节点TreeNode index = root;while (index.value!=value){//如果目标值大if(index.value<value){index = index.right;}else {index = index.left;}if (index==null){return null;}}return index;}//查找节点的父节点public TreeNode searchParent(int value){if (root==null){return null;}//如果不是空的话,定义一个游标,指向根节点TreeNode index = root;//判断treeNode是不是目标节点的父节点while (true){if((index.left!=null&&index.left.value==value)||(index.right!=null&&index.right.value==value)){return index;}else if (value>index.value&&index.right!=null){//目标值大,index游标往右走index = index.right;}else if (value<index.value&&index.left!=null){//目标值小,index游标往左走index = index.left;}else {//没有父节点return null;}}}//找一棵树中的最小值public int min(TreeNode node){TreeNode index = node;if(index.left!=null){index = index.left;}return index.value;}//找一棵树中的最大值public int max(TreeNode node){TreeNode index = node;if(index.right!=null){index = index.right;}return index.value;}//删除public  void delete(int value){if (root==null){System.out.println("此树为空,无需删除");return;}//找到要删除的目标节点TreeNode targer = seach(value);//没有找到目标节点if (targer==null){System.out.println("没有此节点");return;}//找目标节点的父节点TreeNode parent = searchParent(value);//分为三大类if (targer.left==null&&targer.right==null){//删除叶子节点//如果没有父节点if (parent==null){root = null;return;}//如果有父节点//确定要删除的节点是父节点的左孩子还是右孩子if (parent.left!=null&&parent.left.value==value){parent.left = null;}else {parent.right = null;}}else if (targer.left!=null&&targer.right!=null){//删除有两棵子树的节点//找到目标节点右子树的最小值(或者左子树的最大值)int min = min(targer.right);//删除最小值的节点delete(min);//目标节点的值被最小值覆盖targer.value = min;}else {//删除只有一棵字数的节点//如果没有父节点if (parent==null){//判断目标节点有左子树还是有右子树if(targer.left!=null){//有左子树root = targer.left;}else {//有右子树root = targer.right;}return;}//有父节点//确定要删除的节点是父节点的左孩子还是右孩子if (parent.left!=null&&parent.left.value==value){//要删除的节点是父节点的左孩子//判断目标节点有左孩子还是右孩子if(targer.left!=null){//有左孩子parent.left = targer.left;}else {//有右孩子parent.left = targer.right;}}else {//要删除的节点是父节点的右孩子//判断目标节点有左孩子还是右孩子if(targer.left!=null){//有左孩子parent.right = targer.left;}else {//有右孩子parent.right = targer.right;}}}}
}

Test测试:

package 测试;import 树.BinaryTree;public class TreeTest {public static void main(String[] args) {
//        TreeNode t1 = new TreeNode(6);
//        TreeNode t2 = new TreeNode(11);
//        TreeNode t3 = new TreeNode(18);
//        TreeNode t4 = new TreeNode(3);
//        TreeNode t5 = new TreeNode(32);
//        TreeNode t6 = new TreeNode(8);
//        TreeNode t7 = new TreeNode(16);
//
//        t1.left = t4;
//        t1.right = t6;
//        t2.left = t6;
//        t2.right = t7;
//        t3.left = t7;
//        t3.right = t5;
//        System.out.println(t1);BinaryTree tree = new BinaryTree();BinaryTree tree1 = new BinaryTree();tree.insert(10);tree.insert(15);tree.insert(21);tree.insert(8);tree.insert(9);tree.insert(1);tree.insert(12);tree.insert(19);System.out.println(tree.root);tree.levelOrder();tree1.levelOrder();System.out.print("先序遍历为:");tree.beforeOrder(tree.root);System.out.println();System.out.print("中序遍历为:");tree.inOrder(tree.root);System.out.println();System.out.print("后序遍历为:");tree.adterOrder(tree.root);System.out.println();System.out.println("==========================");System.out.println("删除之后:");tree.delete(15);System.out.print("先序遍历为:");tree.beforeOrder(tree.root);System.out.println();System.out.print("中序遍历为:");tree.inOrder(tree.root);System.out.println();System.out.print("后序遍历为:");tree.adterOrder(tree.root);}
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/345116.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十七)- 微服务(7)

11.1 : 同步调用的问题 11.2 异步通讯的优缺点 11.3 MQ MQ就是事件驱动架构中的Broker 安装MQ docker run \-e RABBITMQ_DEFAULT_USERxxxx \-e RABBITMQ_DEFAULT_PASSxxxxx \--name mq \--hostname mq1 \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq:3-management 浏览器访问1…

6、组件通信详解(父子、兄弟、祖孙)

一、父传子 1、props 用法&#xff1a; &#xff08;1&#xff09;父组件用 props绑定数据&#xff0c;表示为 v-bind:props"数据" &#xff08;v-bind:简写为 : &#xff0c;props可以任意命名&#xff09; &#xff08;2&#xff09;子组件用 defineProps([props&…

LabVIEW电路板性能与稳定性测试系统

LabVIEW电路板性能与稳定性测试系统 概述&#xff1a; 开发基于LabVIEW的电路板性能与稳定性测试系统&#xff0c;通过集成多种测试仪器&#xff0c;实现对电路板的电气性能和长期稳定性的全面评估。系统涵盖了电压、电流、温度等多项参数的监测&#xff0c;并具备自动化测试…

IO多路复用详解

1. 概念 IO多路复用也称IO多路转接&#xff0c;它是一种网络通信的手段&#xff08;机制&#xff09;&#xff0c;通过这种方式可以同时监测多个文件描述符并且这个过程是阻塞的&#xff0c;一旦检测到有文件描述符就绪&#xff08; 可以读数据或者可以写数据&#xff09;程序的…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

atomic特质的局限性

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过 在实际的 Objective-C 开发中&#xff0c;大多数属性通常声明为 nonatomic&#xff0c;主要原因包括性能考虑和常见的设计模式。具体原因如下&#xff1a; 性能问…

SemiDrive X9H 平台 QT 静态编译

一、 前言 芯驰 X9H 芯片&#xff0c;搭载多个操作系统协同运行&#xff0c;系统实现了仪表、空调、中控、副驾多媒体的四屏驱动控制&#xff0c;在人车智能交互上可以通过显示屏、屏幕触摸控制、语音控制、物理按键控制、车身协议的完美融合&#xff0c;使汽车更智能。让车主…

【前端技术】 ES6 介绍及常用语法说明

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

vulnhub靶机实战_DC-2

下载 靶机下载链接汇总&#xff1a;https://download.vulnhub.com/使用搜索功能&#xff0c;搜索dc类型的靶机即可。本次实战使用的靶机是&#xff1a;DC-2下载链接&#xff1a;https://download.vulnhub.com/dc/DC-2.zip 启动 下载完成后&#xff0c;打开VMware软件&#xf…

2024最新 Jenkins + Docker实战教程(八)- Jenkins实现集群并发构建

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

9.2 Go 接口的实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Spark作业运行异常慢的问题定位和分析思路

一直很慢 &#x1f422; 运行中状态、卡住了&#xff0c;可以从以下两种方式入手&#xff1a; 如果 Spark UI 上&#xff0c;有正在运行的 Job/Stage/Task&#xff0c;看 Executor 相关信息就好。 第一步&#xff0c;如果发现卡住了&#xff0c;直接找到对应的 Executor 页面&a…

深度解析:AI Prompt 提示词工程的兴起、争议与未来发展

PART1: 提示词工程的兴起 在人工智能领域中&#xff0c;一个新的领域——提示词工程&#xff08;prompt engineering&#xff09;——开始显露头角。 这个领域的核心在于精心设计输入&#xff0c;以引导AI模型产生特定的、期望的输出。 随着AI技术的飞速发展&#xff0c;特别…

[Linux] 软链接使用绝对路径的重要性

文章目录 软链接使用绝对路径的重要性软链接路径复制软链接查看文件类型 软链接使用绝对路径的重要性 软链接路径 软链接必须指定绝对路径&#xff0c;否则复制软链接后&#xff0c;由于软链接的相对路径是从软链接所处位置开始解析的&#xff0c;因此使用相对路径的软链接可…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…

【实战项目二】Python爬取豆瓣影评

目录 一、环境准备 二、编写代码 一、环境准备 pip install beautifulsoup4 pip intall lxml pip install requests我们需要爬取这些影评 二、编写代码 我们发现每个影评所在的div的class都相同&#xff0c;我们可以从这入手 from bs4 import BeautifulSoup import request…

Java面试八股之什么是反射,实现原理是什么

Java中什么是反射&#xff0c;实现原理是什么 Java中的反射&#xff08;Reflection&#xff09;是一种强大的特性&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法的信息。简而言之&#xff0c;反射机制使得程序能够在运行时动态地了解和使用自身或其他程序集中…

如何用群晖当异地组网服务器?

在当今信息化时代&#xff0c;远程通信成为了企业和个人之间不可或缺的一部分。特别是对于跨地区的通信需求&#xff0c;一个可靠的异地组网服务器是必不可少的。而群晖&#xff08;Synology&#xff09;作为一款功能强大的网络存储设备&#xff0c;可以被用作办公室或家庭的异…

pytorch笔记:自动混合精度(AMP)

1 理论部分 1.1 FP16 VS FP32 FP32具有八个指数位和23个小数位&#xff0c;而FP16具有五个指数位和十个小数位Tensor内核支持混合精度数学&#xff0c;即输入为半精度&#xff08;FP16&#xff09;&#xff0c;输出为全精度&#xff08;FP32&#xff09; 1.1.1 使用FP16的优缺…

计算机组成原理复习笔记

前言 就是按照考试的题型写的总结 非常应试版 题型 一、进制转换 只考 十进制 二进制 十六进制 之间的相互转换 一个个看 &#xff08;1&#xff09;十进制 转其他 转二进制&#xff1a;除以2 从小到大取余数&#xff08;0或1&#xff09; 转十六进制 &#xff1a; 除以1…