二叉排序树的删除+图解

图解

在这里插入图片描述

第一种情况

在这里插入图片描述

第二种情况

在这里插入图片描述

第三种情况

在这里插入图片描述

代码实现

package com.atguigu.binarysorttree;import com.sun.javafx.sg.prism.NGImageView;
import javafx.scene.transform.Rotate;import java.io.InputStream;
import java.util.Timer;/*** @创建人 wdl* @创建时间 2021/3/29* @描述*/
public class BinarySortTreeDemo {public static void main(String[] args) {int arr[]={7,3,10,12,5,1,9,0};BinarySortTree binarySortTree = new BinarySortTree();//循环的添加节点到二叉排序树for (int i = 0; i < arr.length; i++) {binarySortTree.add(new Node(arr[i]));}//中序遍历二叉排序树System.out.println("中序遍历二叉排序树");binarySortTree.infixOrder();//测试一下删除叶子节点
//        binarySortTree.delNode(2);
//        System.out.println("删除节点后");
//        binarySortTree.infixOrder();//        binarySortTree.delNode(1);
//        System.out.println("删除节点后");
//        binarySortTree.infixOrder();binarySortTree.delNode(7);System.out.println("删除节点后");binarySortTree.infixOrder();}
}//创建二叉排序树
class BinarySortTree{private Node root;public Node getRoot() {return root;}//查找要 删除的节点public Node search(int value){if (root==null){return null;}else {return root.search(value);}}//查找父节点public Node searchParent(int value){if (root==null){return null;}else {return root.searchParent(value);}}//编写方法//1.返回的是以node为根节点的二叉排序树的最小节点的值//2.删除以node为根节点的二叉排序树的最小节点/**** @param node 传入的节点(当做一颗二叉排序树的根节点)* @return 返回的是以node为根节点的二叉排序树的最小节点的值*/public int delRightTreeMin(Node node){Node target=node;//循环的查找左节点,就会找到最小值while (target.left!=null){target=target.left;}//这时target就指向了最小节点//删除最小节点delNode(target.value);return target.value;}//删除节点public void delNode(int value){if(root==null){return;}else {//1.需求先找到要删除节点targetNodeNode targetNode = search(value);//如果没有找到要删除的节点if(targetNode==null){return;}//如果我们发现targetNode没有父节点//如果们发现当前这颗二叉排序树只有一个节点if (root.left==null&&root.right==null){root=null;return;}//去找到targetNode的父节点Node parent = searchParent(value);//如果要删除的节点是叶子节点if(targetNode.left==null&&targetNode.right==null){//判断targetNode是父节点的左子节点,还是右子节点if (parent.left!=null&&parent.left.value==value){//是左子节点parent.left=null;}else if (parent.right!=null&&parent.right.value==value){//是右子节点parent.right=null;}}else if(targetNode.left!=null&&targetNode.right!=null){//删除有两颗子树的节点int minVal=delRightTreeMin(targetNode.right);targetNode.value=minVal;}else {//删除只有一颗子树的节点//如果要要删除的节点有左子节点if (targetNode.left!=null){if(parent!=null){if (parent.left.value==value){//是左子节点parent.left=targetNode.left;}else{//是右子节点parent.right=targetNode.left;}}else {root=targetNode.left;}}else{ //如果要要删除的节点有右子节点if (parent!=null){if (parent.left.value==value){//是左子节点parent.left=targetNode.right;}else{//是右子节点parent.right=targetNode.right;}}else {root=targetNode.right;}}}}}//添加节点的方法public void add(Node node){if(root==null){root=node;//如果root为空直接让root指向node}else {root.add(node);}}//中序遍历public void infixOrder(){if(root!=null){root.infixOrder();}else {System.out.println("二叉排序树为空,不能遍历");}}}//创建Node节点
class Node{int value;Node left;Node right;public Node(int value) {this.value = value;}//查找要删除的节点/**** @param value 希望删除的节点的值* @return 如果找到返回该节点,否则返回null*/public Node search(int value){if(value==this.value){//找到就是该节点return this;}else if (value<this.value){//如果查找的值小于当前节点,向左子树递归查找//如果左子节点为空if(this.left==null){return null;}return this.left.search(value);}else {//如果查找的值不小于当前节点,向右子树递归查找//如果右子节点为空if(this.right==null){return null;}return this.right.search(value);}}//查找要删除节点的父节点/**** @param value 要找到的节点的值* @return 返回的是要删除节点的父节点,如果没有就返回null*/public Node searchParent(int value){//如果当前节点就是要删除的节点的父节点,就返回if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value)){return  this;}else {//如果查找的值小于当前节点的值,并且当前节点的左子节点不为空if(value<this.value&&this.left!=null){return this.left.searchParent(value);//向左子树递归查找}else if(value>=this.value&&this.right!=null){return this.right.searchParent(value);//向右子树递归查找}else {return null;//没有找到父节点}}}@Overridepublic String toString() {return "Node{" +"value=" + value +'}';}//添加节点的方法//递归的形式添加节点,注意需要二叉排序树的要求public void add(Node node){if(node==null){return;}//判断传入节点的值,和当前子树的根节点的值得关系if(node.value<this.value){//如果当前节点的左子节点为nullif(this.left==null){this.left=node;}else {//递归的向左子树添加this.left.add(node);}}else {//添加的节点的值大于当前节点的值//如果当前节点的左子节点为nullif(this.right==null){this.right=node;}else {//递归的向左子树添加this.right.add(node);}}}//中序遍历public void infixOrder(){if(this.left!=null){this.left.infixOrder();}System.out.println(this);if (this.right!=null){this.right.infixOrder();}}}

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

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

相关文章

如何一秒钟从头构建一个 ASP.NET Core 中间件

前言 其实地上本没有路&#xff0c;走的人多了&#xff0c;也便成了路。 -- 鲁迅 就像上面鲁迅说的那样&#xff0c;其实在我们开发中间件的过程中&#xff0c;微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序&#xff0c; 但是其中却存在者一些最佳实践的方法&…

Spring Bean 定义继承

转载自 Spring Bean 定义继承 Bean 定义继承 bean 定义可以包含很多的配置信息&#xff0c;包括构造函数的参数&#xff0c;属性值&#xff0c;容器的具体信息例如初始化方法&#xff0c;静态工厂方法名&#xff0c;等等。 子 bean 的定义继承父定义的配置数据。子定义可以…

ssm(Spring+Spring mvc+mybatis)

在不久的之前我写了一篇ssh(SpringSpring mvchibernate)的文章&#xff0c;感兴趣的可以去这里看看~ 今天我来写一下ssm的增删改欧查案例&#xff1a; 数据库&#xff1a;mysql 浏览器&#xff1a;火狐浏览器 jdk&#xff1a;1.7 开发编辑器&#xff1a;myeclipse10.5 首…

grub shell 错误_使用grub-install修复Grub时出错

你的位置:问答吧-> Debian-> 问题详情使用grub-install修复Grub时出错WinXPDebian双系统&#xff0c;由于误操作导致开机后无法进入系统&#xff0c;错误信息为&#xff1a;GRUB Loading stage1.5.GRUB loading,please wait...error 22按照网上的说法&#xff0c;使用启动…

C# winform程序免安装.net framework在XP/win7/win10环境运行

前文&#xff1a; 首先感谢群里的大神宇内流云 提供的anyexec for windows版本。 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后&#xff0c;测试通过,如下是用的xp运行winfrom程序的部分截图 下面是n年前入坑C#写的winform。。。玩毒奶粉用的&#xff0c;勿喷。 .…

ssm(Spring+Spring mvc+mybatis)实体类——Dept

package org.entity;/**.* * * 项目名称&#xff1a;test_ssm_16qn3 * 类名称&#xff1a;Dept * 类描述&#xff1a; 部门表实体类 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-12-26 下午8:30:55 * 修改人&#xff1a;Mu Xiongxiong …

Spring 基于构造函数的依赖注入

转载自 Spring 基于构造函数的依赖注入 Spring 基于构造函数的依赖注入 当容器调用带有一组参数的类构造函数时&#xff0c;基于构造函数的 DI 就完成了&#xff0c;其中每个参数代表一个对其他类的依赖。 示例&#xff1a; 下面的例子显示了一个类 TextEditor&#xff0c…

AVL树双旋转+图解

图解 代码实现 package com.atguigu.avl; /*** 创建人 wdl* 创建时间 2021/3/30* 描述*/ public class AVLTreeDemo {public static void main(String[] args) { // int[] arr{4,3,6,5,7,8};//创建一个AVLTree对象 // int arr[]{10,12,8,9,7,6};int[] arr{10,11…

ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao

package org.dao;import java.util.List;import org.entity.Dept;/*** * * 项目名称&#xff1a;test_ssm_16qn3 * 类名称&#xff1a;IDeptDao * 类描述&#xff1a; 部门表的接口 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-12-26 下午8:…

Spring 基于设值函数的依赖注入

Spring 基于设值函数的依赖注入 当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后&#xff0c;通过容器在你的 bean 上调用设值函数&#xff0c;基于设值函数的 DI 就完成了。 示例&#xff1a; 下述例子显示了一个类 TextEditor&#xff0c…

[SSCore] 开源dotnet core 版本 SuperSocket

前言碎语 最近一直在做旧版本dotnet 程序迁移至dotnet core的工作, 非常欣慰dotnet社区的蓬勃发展, 目前大部分的第三方类库或开源代码都有了dotnet core版本 或者可以方便的找到替代方案. 这其中我唯一觉得遗憾的是dotnet 社区大名鼎鼎的socket 通讯框架SuperSocket SuperSock…

字母图形

资源限制 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&#xff0c;请找出这个图形的规律&#xff0c;并…

Spring 注入内部 Beans

转载自 Spring 注入内部 Beans 注入内部 Beans 正如你所知道的 Java 内部类是在其他类的范围内被定义的&#xff0c;同理&#xff0c;inner beans 是在其他 bean 的范围内定义的 bean。因此在 或 元素内 元素被称为内部bean&#xff0c;如下所示。 <?xml version"…

asp.net core mvc剖析:KestrelServer

KestrelServer是基于Libuv开发的高性能web服务器&#xff0c;那我们现在就来看一下它是如何工作的。在上一篇文章中提到了Program的Main方法&#xff0c;在这个方法里Build了一个WebHost&#xff0c;我们再来看一下代码&#xff1a; public static void Main( string [] args) …

ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl

/** * Title: DeptDaoImpl.java * Package org.dao.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-12-26 下午9:02:32 * version V1.0 */ package org.dao.impl;import java.util.List;import org.dao.IDeptDao…

win 7 mysql 1067_win7系统登陆MySQL服务出现1067错误的解决方法

很多小伙伴都遇到过win7系统登陆MySQL服务出现1067错误的困惑吧&#xff0c;一些朋友看过网上零散的win7系统登陆MySQL服务出现1067错误的处理方法&#xff0c;并没有完完全全明白win7系统登陆MySQL服务出现1067错误是如何解决的&#xff0c;今天小编准备了简单的解决办法&…

图的快速入门

快速入门案例 代码实现 package com.atguigu.graph;import java.util.ArrayList; import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/4/2* 描述*/ public class Graph {private ArrayList<String> vertexList;//存储顶点集合private int[][] edges;//存储图对应的…

Spring 注入集合

转载自 Spring 注入集合 注入集合 你已经看到了如何使用 value 属性来配置基本数据类型和在你的 bean 配置文件中使用<property>标签的 ref 属性来配置对象引用。这两种情况下处理奇异值传递给一个 bean。 现在如果你想传递多个值&#xff0c;如 Java Collection 类…

.net core依赖注入的封装

现在流行的系统一般都采用依赖注入的实现方式&#xff0c;利用DI容器来直接获取所用到的类/接口的实例。.net core也一样采用DI的方式&#xff0c;提供了DI容器的接口IServiceCollection&#xff0c;并提供了基于该接口的缺省实现ServiceCollection。 这样我们就可以不再像以前…

ssm(Spring+Spring mvc+mybatis)Dao层配置sql的文件——DeptDaoMapper.xml

<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace&#xff1a;接口的全路径名 --> <map…