二叉排序树(二叉查找树、二叉搜索树)

二叉排序树(二叉查找树、二叉搜索树)什么是二叉查找树 根节点的值大于其左子树中任意一个节点的值 小于其右节点中任意一节点的值 这一规则适用于二叉查找树中的每一个节点 本文章重点来讨论一下关于二叉查找树删除节点的问题 有一下二叉查找树 如图 在删除节点的时候我们只需考虑一下三种情况 1 要删除的节点是叶子结点 如图 2 要删除的节点有左节点但是没有右节点 或者有右节点但是没有左节点 如图 3 要删除的节点既有

package com.zc.algorithm; public class BinarySortTree { public class Node{ int value; Node left; Node right; 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 { if(this.right == null) { this.right =node; } else { this.right.add(node); } } } / * 前序遍历二叉排序树 * @param node */ public void middleOder(Node node) { if(node == null) { return; } middleOder(node.left); System.out.println(node.value); middleOder(node.right); } / * 查找某一节点 * @param value * @return */ public Node search(int value) { if(this.value == 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(this.value > value&& this.left != null) { return this.left.searchParent(value); } else if(this.value < value && this.right !=null) { return this.right.searchParent(value); } } return null; } } Node root; / * 向二叉排序树中添加节点 * @param node */ public void add(Node node) { if(root == null) { root = node; } else { root.add(node); } } public void frontShow() { if(root != null) { this.root.middleOder(root); } } public Node SearchNode(int value) { if(root == null) return null; else { return root.search(value); } } public void delete(int value) { if (root == null) return; else { Node target = SearchNode(value); //如果没有这个节点 if(target == null) { return; } //找到他的父节点 Node parent = searchParent(value); //要删除的节点是叶子结点 if(target.left == null && target.right == null) { //要删除的节点是节点的左子节点 if(parent.left.value == value) { parent.left =null; } else { parent.right = null; } } //要删除的节点有两个子节点的情况 else if(target.left != null && target.right != null) { //删除右子树中值最小的节点,并获取到该节点的值 int min = minDelete(target.right); //替换目标节点中的值 target.value = min; } else { //需要删除的目标节点的左节点不为空 if(target.left != null) { //要删除的子节点是其父节点的左子节点,并且有左节点而没有有节点 if(parent.left.value == value) { parent.left = target.left; } //要删除的子节点是其父节点的右子节点,并且有左节点而没有有节点 else { parent.right = target.left; } } //需要删除的目标节点的右节点不为空 else { //要删除的节点是父节点的左节点,并且有右节点儿没有左节点 if(parent.left.value == value) { parent.left = target.right; } //要删除的节点是其父节点的右节点,并且有右孩子没有左孩子 else { parent.right = target.right; } } } } } / * 删除一颗树中最小的节点 * @param node * @return */ public int minDelete(Node node) { Node target = node; while(target.left != null) { target = target.left; } delete(target.value); return target.value; } / * 查找父节点 * @param value * @return */ public Node searchParent(int value) { if(root == null) { return null; } else { return root.searchParent(value); } } public static void main(String[] args) { int[] arr = new int[]{7,3,10,12,5,1,9}; BinarySortTree binTree = new BinarySortTree(); for(int i : arr) { binTree.add(binTree.new Node(i)); } binTree.delete(7); //查看树中的值 binTree.frontShow(); //查找 // Node node = binTree.new Node(3); //Node res = binTree.SearchNode(node.value); //System.out.println(res.value); // Node temp = binTree.SearchNode(20); //System.out.println(temp.value); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201952.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午8:13
下一篇 2026年3月20日 上午8:13


相关推荐

  • 阿里云通义 CoPaw 发布:对标 OpenClaw,可端可云且支持钉钉、飞书、QQ 接入

    阿里云通义 CoPaw 发布:对标 OpenClaw,可端可云且支持钉钉、飞书、QQ 接入

    2026年3月13日
    2
  • java转大数据方向学习路线

    java转大数据方向学习路线申明:本文旨在为普通程序员(Java程序员最佳)提供一个入门级别的大数据技术学习路径,不适用于大数据工程师的进阶学习,也不适用于零编程基础的同学。目录前言一、背景介绍二、大数据介绍正文一、大数据相关工作介绍二、大数据工程师的技能要求必须掌握的技能11条高阶技能6条三、大数据学习规划第一阶段(基础阶段)第二阶段(攻坚阶段)第三阶段(辅助工具工学…

    2022年4月29日
    52
  • pip安装scrapy失败_python的scrapy框架的安装

    pip安装scrapy失败_python的scrapy框架的安装错误如图所示,running setup.py install for Twisted…..errorTwisted依赖库安装报错,重新下载手动安装一下下载网址:https://www.lfd.uci.edu/~gohlke/pythonlibs注意:看下安装的python是什么版本,我安装的python 3.9.0,就下载cp39,64位的下载安装的版本不对,就会报:Twisted-20.3.0-cp38-cp38-win_amd64.whl is not a support…

    2022年8月18日
    12
  • python 之免费ip代理池[通俗易懂]

    python 之免费ip代理池[通俗易懂]基于proxy_pool,部署了一个开放的免费ip代理池,提供出来供大家使用。数据有效性每2分钟更新一次。地址:http://proxy.linuxdba.ltd/all/开源项目地址:https://github.com/jhao104/proxy_pool

    2022年5月29日
    64
  • 情感词典构建_文本情感分析的意义

    情感词典构建_文本情感分析的意义这是4个月前做的。受当时的知识水平的限制,还没有接触到机器学习和相关理论,记录一下作为以后备查。当然,如果你想看源码和资料,点击我。从结项到现在,博主一直在使用机器学习并结合相关论文进行情感极性分析(源码点我),效果远远好于本篇代码的效果。但是,本篇的数据处理和特征选择还是很有意义的,特此记录。摘要        当今社会媒体的发展导致了金融舆论数据的爆炸式增长。因此,针对金融舆论数据的情

    2022年8月23日
    12
  • 字符串放到数组里面_shell dash使用数组

    字符串放到数组里面_shell dash使用数组先引用一段资料,出自:http://bbs.chinaunix.net/thread-4125147-1-1.html红色注释为个人添加————————————————————–搬运内容分割线———————————————————–

    2025年7月17日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号