你好!二叉排序树【JAVA】

news2024/11/15 21:53:46

目录

1.简单介绍

2.创建节点 

3.创建二叉排序树

4.二叉树的删除 

5.创建节点

6.创建二叉树


1.简单介绍

二叉排序树: BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点:要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大

特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点

 

2.创建节点 

/**
 * 创建节点
 */
class Node {
    int value;
    Node left;
    Node right;

    public Node() {
    }

    public Node(int value) {
        this.value = value;
    }

    /**
     * 添加节点,递归
     */
    public void add(Node node) {
        if (node == null) {
            return;
        }
        //判断节点的值,和当前子树的根节点的关系
        if (node.value < this.value) {
            if (this.left == null) {
                this.left = node;
            } else {
                //递归向左添加
                this.left.add(node);
            }
        } else {//node.value>this.value
            if (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();
        }
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }
}

3.创建二叉排序树


/**
 * 创建二叉排序树
 */
class  BinarySortTree{
    private Node root;

    //添加节点的方法
    public void add(Node node){
        if (root==null){
            root=node;
        }else {
            root.add(node);
        }
    }
    //中序遍历
    public void infixOrder(){
        if (root!=null){
            root.infixOrder();
        }else {
            System.out.println("二叉树是空的");
        }
    }
}

4.二叉树的删除 

三种情况:

  • 1.删除叶子节点
  • 2.删除只有一颗子树的节点 
  • 3.删除有两颗子树的节点

思路 

情况一:

  • 1.找到要删除的节点 targetNode
  • 2.找到targetNode的父节点 parent
  • 3.确定targetNode是parent的左子节点还是右子节点
  • 4.根据条件对应删除:左子节点: parent.left=null ; 右子节点:parent.right=null

情况二:

  • 1.找到要删除的节点 targetNode
  • 2.找到targetNode的父节点 parent
  • 3.确定targetNode的子节点是左子节点还是右子节点
  • 4.targetNode是parent的左子节点还是右子节点
  • 5.如果targetNode是parent的左子节点:
  • 5.1.targetNode的子节点是左子节点:parent.left=targetNode.left;
  • 5.2.targetNode的子节点是右子节点:parent.left=targetNode.right;
  • 6.如果targetNode是parent的右子节点:
  • 6.1.targetNode的子节点是左子节点:parent.left=targetNode.left;
  • 6.2.targetNode的子节点是右子节点:parent.left=targetNode.right;

情况三:

  • 1.找到要删除的节点 targetNode
  • 2.找到targetNode的父节点 parent
  • 3.从targetNode的右子树找到最小的节点
  • 4.用一个临时变量,将最小节点的值保存temp
  • 5.删除最小的节点
  • 6.targetNode.value=temp

5.创建节点

 在节点中直接声明好,查找其父节点,待删除的节点,递归添加,中序遍历

/**
 * 创建节点
 */
class Node {
    int value;
    Node left;
    Node right;

    public Node() {
    }

    public Node(int value) {
        this.value = value;
    }

    /**
     * 删除节点
     */
    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);
        }
    }

    /**
     * 待删除节点的父节点
     */
    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;
            }
        }
    }

    /**
     * 添加节点,递归
     */
    public void add(Node node) {
        if (node == null) {
            return;
        }
        //判断节点的值,和当前子树的根节点的关系
        if (node.value < this.value) {
            if (this.left == null) {
                this.left = node;
            } else {
                //递归向左添加
                this.left.add(node);
            }
        } else {//node.value>this.value
            if (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();
        }
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }
}

6.创建二叉树


/**
 * 创建二叉排序树
 */
class BinarySortTree {
    private Node 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);
        }
    }

    //返回以node为根节点的二叉排序树的最小值,并删除
    public int deleteTreeMin(Node node) {
        Node target = node;
        while (target.left != null) {
            target = target.left;
        }
        //此时target是最小的,将其删除
        deleteNode(target.value);
        return target.value;

    }

    //删除节点
    public void deleteNode(int value) {
        if (root == null) {
            return;
        } else {
            //1.先找到targetNode
            Node targetNode = search(value);
            if (targetNode == null) {
                return;
            }
            //如果发现二叉树只有一个节点
            if (root.left == null && root.right == null) {
                root = null;
                return;
            }
            //找targetNode的父节点
            Node parent = searchParent(value);
            //如果删除的节点是叶子节点
            if (targetNode.left == null && targetNode.right == null) {
                //判断targetNode是parent的左子节点还是右子节点
                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 minValue = deleteTreeMin(targetNode.right);
                targetNode.value = minValue;
            } else {//删除只有一棵子树节点
                if (parent != null) {
                    if (targetNode.left != null) {//删除的节点有左子节点
                        if (parent.left.value == value) {//targetNode是parent的左子节点
                            parent.left = targetNode.left;
                        } else {//targetNode是parent的右子节点
                            parent.right = targetNode.left;
                        }
                    } else {
                        root = targetNode.left;
                    }
                } else {//要删除的节点有右子节点
                    if (parent != null) {
                        if (parent.left.value == value) {//targetNode是parent的左子节点
                            parent.left = targetNode.right;
                        } else {//targetNode是parent右子节点
                            parent.right = targetNode.right;
                        }
                    } else {
                        root = targetNode.right;
                    }
                }

            }
        }
    }


    //添加节点的方法
    public void add(Node node) {
        if (root == null) {
            root = node;
        } else {
            root.add(node);
        }
    }

    //中序遍历
    public void infixOrder() {
        if (root != null) {
            root.infixOrder();
        } else {
            System.out.println("二叉树是空的");
        }
    }
}

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

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

相关文章

HTTP协议设备接入

本文主要介绍使用Postman模拟HTTP协议&#xff0c;将设备连接到平台内置HTTP服务。 操作步骤 创建产品 物联网->设备管理->选择产品&#xff0c;填写产品基础信息。 参数 对应设备侧参数 ID 产品唯一标识&#xff0c;若不填写&#xff0c;系统将自动生成唯一ID 设备…

基于ssm校园二手交易平台论文

校园二手交易平台 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了校园二手交易平台的开发全过程。通过分析企业对于校园二手交易平台的需求&#xff0c;创建了一个计算机管理校园二手交易平台的方案。文章介绍…

高效实现Java编程:将Excel XLSX转换为PDF的技巧

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 Java是一种广泛使用的编程语言&#xff0c;它在企业级应用开发中发挥着重要作用。而在实际的开发过程中&#x…

运行hive的beelin2时候going to print operations logs printed operations logs

运行hive的beelin2时候going to print operations logs printed operations logs 检查HiveServer2的配置文件hive-site.xml&#xff0c;确保以下属性被正确设置&#xff1a; <property><name>hive.async.log.enabled</name><value>false</value>…

【服务器】Linux 安装 Jenkins+cpolar实现远程访问

Jenkins是一个开源的持续集成(CI)和持续交付(CD)工具&#xff0c;用于自动化构建、测试和部署软件项目。它提供了一个易于使用的平台&#xff0c;用于构建、测试和交付软件的过程。 下面介绍在Linux CentOS 7中如何实现安装Jenkins和结合cpolar 内网穿透工具实现远程访问Jenkin…

贝蒂详解<string.h>哦~(用法与实现)

目录 引言&#xff1a; &#xff08;一&#xff09;字符函数和字符串函数 1.简介 2.strlen()函数 2.1用法 2.2实例 2.3 实现strlen() &#xff08;1&#xff09;计数法 &#xff08;2&#xff09;递归法 &#xff08;3&#xff09; 指针-指针 2.4sizeof和strlen()的区别 3.s…

Java:语法速通

参考 菜鸟教程 java 继承 class 父类 { }class 子类 extends 父类 { }继承的特性&#xff1a; 子类拥有父类非private的属性和方法子类可以对父类进行扩展子类可以重写父类的方法使用extends只能单继承&#xff0c;使用implements可以变相的多继承&#xff0c;即一个类继承…

P71自监督式学习

命名都以芝麻街的角色命名 x 分为x’ 和 x’’ &#xff0c;自己跟自己学bert 架构跟 transformer Encoder 一样&#xff0c;输入一排向量&#xff0c;输出一排向量&#xff0c;一般用在自然语言处理上 模型大小&#xff1a; x 分为 x’ x’’ 自学习 bert 可以做输入一排向…

未来之笔:AI绘画如何重新定义人物设计艺术

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;艺术创作领域正迎来一场革命性的变革。AI绘画正在重新定义人物设计艺术&#xff0c;为艺术家和设计师带来前所未有的创作可能性。人物设计作为艺术创作中的重要组成部分&#xff0c;正在受到AI技术革新的深刻…

前端-如何自己做一个可视化的人员选择泛用组件

一、展示组件效果 二、组件的功能 1.用户可以在搜索框里输入字符&#xff0c;下方列表实时变动&#xff08;筛选出包含搜索字符的可选项&#xff09;&#xff0c;如果没有字符&#xff0c;就展示所有的选项 2.用户点击可选项&#xff0c;右侧出现标签 3.用户点击标签的XX&am…

【Git】Git基本操作

文章目录 Git 是什么Git 的优点Git 安装Linux UbuntuLinux CentOsWindows Git 基本操作1. 创建 Git 本地仓库2. 配置 Git3. Git工作区、暂存区和版本库4. 添加文件5. 查看 .git 文件6. 修改文件7. 版本回退 Git 是什么 Git是一个免费的、开源的分布式版本控制系统&#xff0c;…

国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

Ubuntu 常用命令之 top 命令用法介绍

top命令是Linux下常用的性能分析工具&#xff0c;可以实时动态地查看系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。它可以显示系统总的和分区的CPU使用率、内存使用率、交换区使用率、系统负载、进程数、最耗CPU的进程等信息。 top命令的参数如下 -b…

数据之门:使用IPIDEA开启网络自由之旅~

本文目录 前言一、网络代理IP简介二、IPIDEA 优势2.1 多种类型IP代理2.2 海量纯净代理池2.3 稳定高效数据收集架构2.4 个人IP管理中心 三、IP代理实操小Tips3.1 查看本地网络IP3.2 使用浏览器IP代理3.3 使用IPIDEA进行爬虫实操 四、总结 前言 各位友友&#xff0c;大家好&…

Win10电脑字体太浅了看不清的解决方法

在Win10电脑操作过程中&#xff0c;用户发现电脑字体太浅了&#xff0c;自己都看不清字体了&#xff0c;这样比较影响自己的操作效率。下面小编给大家带来Win10字体颜色太淡的解决方法&#xff0c;解决后用户可以看到Win10电脑字体颜色就不会太淡&#xff0c;视觉体验感也更好。…

22款奔驰E260L升级原厂360全景影像 效果分享

很多车友们会问个问题 就是升级这些功能会不会有异响&#xff1f;我们星骏汇回答这个问题 有异响是因为师傅经验不够安装的不够仔细 &#xff0c;像卡扣卡不到位 原厂预留位置 安装的不准确 可能就会造成异响&#xff0c;也有很多车友会问 为什么要升级呢&#xff1f;准确的来说…

众和策略:网络安全行业未来增速可期 多股获机构扎堆调研

工业和信息化部、国家网信办、人力资源和社会确保部等十四部分近来联合印发《关于打开网络安全技术运用试点演示作业的告诉》&#xff08;以下简称《告诉》&#xff09;&#xff0c;将以新式信息基础设备安全、数字化运用场景安全、安全基础才干进步为主线&#xff0c;遴选一批…

(1)(1.9) MSP (version 4.2)

文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议&#xff0c;可通过任何串行端口进行遥测、OSD 和传感器。这样&#xff0c;ArduPilot 就能将遥测数据发送到 MSP 兼容设备&#xff08;如大疆护目镜&#xff09;&#xff0c;用于屏幕显示&#x…

生产问题(十二)GC垃圾回收导致空指针

一、引言 最近线上出现由于线程池任务执行超时导致的空指针&#xff0c;按道理说基本不会很多执行超时的&#xff0c;看了看监控&#xff0c;那个时间点发生了gc&#xff0c;gc时间超过5s。 说明这次是gc垃圾回收导致的问题&#xff0c;实际上需要排查解决的是垃圾回收问题。表…

element plus 表格el-table行多选单选

1 行多选-点击checkbox 添加一个 el-table-column&#xff0c;设 type 属性为 selection 即可 <template><div class"box"><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type&…