当前位置: 首页 > news >正文

二叉排序树的增删改查(java版)

文章目录

  • 1. 基本节点
  • 2. 二叉排序树
    • 2.1 增加节点
    • 2.2 查找(就是遍历)就一起写了吧
    • 2.3 广度优先遍历
    • 2.4 删除(这个有点意思)
    • 2.5 测试样例

最后的删除,目前我测试的是正确的

1. 基本节点

TreeNode:

class TreeNode{private int val;TreeNode left;TreeNode right;public void setLeft(TreeNode left){this.left = left;}public void setRight(TreeNode right){this.right = right;}TreeNode(){}TreeNode(int val){this.val = val;}public int getVal(){return this.val;}public String toStringNode(){String ans = "[ val = " + this.val;if(this.left != null){ans += "->left = " + this.left.toStringNode();}if(this.right != null){ans += "->right = " + this.right.toStringNode() + "]";}return ans;}public void setVal(int val){this.val = val;}
}

2. 二叉排序树

class BinaryTree{public TreeNode root;
}

里面写一些方法吧!!!

2.1 增加节点

其实就是插入:

public void insert(int val){TreeNode newNode = new TreeNode(val);if(root == null){root = newNode;return;}TreeNode curNode = root;TreeNode preNode;while(true){preNode = curNode;if(newNode.getVal() > curNode.getVal()){curNode = curNode.right;if(curNode == null){preNode.setRight(newNode);return;}}else{curNode = curNode.left;if(curNode == null){preNode.setLeft(newNode);return;}}}}

2.2 查找(就是遍历)就一起写了吧

跟修改一样

public void inOrder(TreeNode root){if(root == null)return;inOrder(root.left);System.out.print(root.getVal() + " ");inOrder(root.right);}public void preOrder(TreeNode root){if(root == null)return;System.out.print(root.getVal() + " ");preOrder(root.left);preOrder(root.right);}public void HOrder(TreeNode root){if(root == null)return;HOrder(root.left);HOrder(root.right);System.out.print(root.getVal() + " ");}

2.3 广度优先遍历

利用队列

// 广度优先搜索void BFS(){if(this.root == null){System.out.println("BFS: null");return;}System.out.print("BFS: ");Queue<TreeNode> queue = new LinkedList<>();queue.add(this.root);while(!queue.isEmpty()){TreeNode cur = queue.poll();System.out.print(cur.getVal() + " ");if(cur.left != null)queue.add(cur.left);if(cur.right != null)queue.add(cur.right);}}

2.4 删除(这个有点意思)

分了六类情况:

  • 目标节点是叶子节点(直接删了)
  • 目标节点只有一个孩子(直接连接上)
  • 目标节点有俩孩子
    • 左孩子没有右孩子(把目标右子树连在左孩子的右孩子上,然后目标父亲那条指向左孩子)
    • 右孩子没有左孩子(把目标左子树连在右孩子的左孩子上,然后目标父亲那条指向右孩子)
    • 最坏情况了,找目标节点的左孩子最右或者左孩子最左(交换值,删了那个被交换的孩子)
// 删除节点// 获取最左最右节点public TreeNode getLR(TreeNode root){if(root == null || (root.left == null && root.right == null))return null;TreeNode ans;if(root.left != null){if(root.left.right == null)return root.left;ans = root.left.right;while(ans.right != null){ans = ans.right;}// System.out.println("获取最右");return ans;}if(root.right != null){if(root.right.left == null)return root.right;ans = root.right.left;while(ans.left != null){ans = ans.left;}// System.out.println("获取最左");return ans;}return null;}// 获取父节点public TreeNode getParent(TreeNode root, int val){if(root == null || (root.left == null && root.right == null) || root.getVal() == val)return null;// 左孩子不等if(root.getVal() > val){if(root.left != null){if(root.left.getVal() == val)return root;elsereturn getParent(root.left, val);}elsereturn null;}else{if(root.right != null){if(root.right.getVal() == val)return root;elsereturn getParent(root.right, val);}elsereturn null;}}public void delNode(int val){TreeNode parent = new TreeNode(Integer.MAX_VALUE);parent.left = root;delNode(val, parent, null);this.root = parent.left;}public void delNode(int val, TreeNode root, TreeNode parent){if(root == null)return;if(root.getVal() < val){delNode(val, root.right, root);}else if(root.getVal() > val){delNode(val, root.left, root);}else{  // 相等if(root.left != null && root.right == null){    // 没有左孩子if(parent.left == root){parent.left = root.left;}else{parent.right = root.left;}}else if(root.left == null && root.right != null){  // 没有右孩子if(parent.left == root){parent.left = root.right;}else{parent.right = root.right;}}else if(root.left == null && root.right == null){  // 都是nullif(parent.left == root){parent.left = null;}else{parent.right = null;} }else{ // 进行交换if(root.left.right == null){root.left.right = root.right;if(parent.left == root){parent.left = root.left;}else{parent.right = root.left;}}else if(root.right.left == null){root.right.left = root.left;if(parent.left == root){parent.left = root.left;}else{parent.right = root.left;}}else{TreeNode cur = getLR(root); // 获取最左最右节点// 删除那个节点TreeNode curParent = getParent(root, cur.getVal()); // 获取父节点if(curParent.getVal() > cur.getVal())curParent.left = null;else{curParent.right = null;}root.setVal(cur.getVal());  // 设置值}}}}

2.5 测试样例

public class Test2{public static void main(String[] args) {TreeNode node1 = new TreeNode(1);TreeNode node2 = new TreeNode(2);TreeNode node3 = new TreeNode(3);TreeNode node4 = new TreeNode(4);TreeNode node5 = new TreeNode(5);TreeNode node6 = new TreeNode(6);// 进行构建node1.setRight(node2);node1.setLeft(node3);node3.setLeft(node4);node4.setLeft(node5);node4.setRight(node6);// System.out.println(node1.toStringNode());BinaryTree b = new BinaryTree();b.insert(5);b.insert(7);b.insert(4);b.insert(2);b.insert(0);b.insert(3);b.insert(8);b.insert(6);b.insert(1);// System.out.println(b.root.toStringNode());// System.out.println(b.getParent(b.root, 3).getVal());for(int i = 8; i >= 0; i--){System.out.println("删除了:" + i);b.delNode(i);b.BFS();System.out.println();}// // 中序// System.out.println("中序:");// // 先序// System.out.println();// System.out.println("先序:");// b.preOrder(b.root);// // 后序// System.out.println();// System.out.println("后序:");// b.HOrder(b.root);// // 深度System.out.println();b.BFS();}
}

相关文章:

二叉排序树的增删改查(java版)

文章目录 1. 基本节点2. 二叉排序树2.1 增加节点2.2 查找&#xff08;就是遍历&#xff09;就一起写了吧2.3 广度优先遍历2.4 删除&#xff08;这个有点意思&#xff09;2.5 测试样例 最后的删除&#xff0c;目前我测试的是正确的 1. 基本节点 TreeNode: class TreeNode{pri…...

linux下coredump问题的定位分析方法

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考&#xff1a;https://blog.csdn.net/m0_73698480/article/details/130077852 最近定位了一段时间linux下的崩溃问题&#xff0c;又收集了一些思路&#xff0c;特整理记录一下。 常见coredump定位方法是&#xff1a…...

第十届蓝桥杯省赛真题(C/C++大学B组)

目录 试题 A: 组队 试题 B: 年号字串 试题 C: 数列求值 试题 D: 数的分解 试题 E: 迷宫 试题 F: 特别数的和 试题 G&#xff1a;完全二叉树的权值 试题 H&#xff1a;等差数列 试题 I&#xff1a;后缀表达式&#xff08;不一定对&#xff09; 试题 J&#xff1a;灵能…...

Scrapy 爬取m3u8视频

Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址&#xff1a;[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…...

LVGL简单记录

1、 vs中代码旁边有个小锁删除git 2、Visual Studio 试图编译已删除的文件&#xff0c; 如果这个文件也是你不再需要编译的文件&#xff0c;且已经从文件系统中删除&#xff0c;你需要从 .vcxproj 文件中移除或者注释掉这一行&#xff0c;以停止Visual Studio尝试去编译一个不…...

计算机网络——ARP协议

前言 本博客是博主用于复习计算机网络的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结&#xff0c;讲的非常好。 可以先去看一篇视频&#xff0c;再来参考这篇笔记&#xff08;或者说直接偷走&#xff09;。 …...

【C++]C/C++的内存管理

这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…...

深入理解计算机网络分层结构

一、 为什么要分层&#xff1f; 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次&#xff0c;每个层次负责特定的功能。这样做有以下几个好处&#xff1a; 模块化设计&#xff1a;每个层次都有清晰定义的功能和接口&#xff0c;使得网络系统更易于设…...

亚马逊云科技CTO带你学习云计算降本增效秘诀

2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote&#xff0c;这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要&#xff1f; ▶️企业基础设施投入大&#xff0c;利用好降本策略可以减少巨…...

快速上手Vue

目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面&#xff1a;基于数据渲染出用户看到的页面 渐进式&#xff1a;Vue相关生态&#xff1a;声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...

java 目录整理

Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...

使用Python的Pillow库进行图像处理书法参赛作品

介绍&#xff1a; 在计算机视觉和图像处理领域&#xff0c;Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具&#xff0c;使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件&#xff0c;并对选中的图像进行调整和…...

docker 容器指定utf-8编码

在运行 Docker 容器的时候&#xff0c;如果容器内应用需要使用 UTF-8 编码来正常处理中文&#xff0c;你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如&#xff0c;设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8&#xff1a…...

单例模式以及常见的两种实现模式

单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”&#xff0c;按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例&#xff0c;如果创建出了多个实例&#xff0c;就会编译报错。而不会创建出多个实…...

Java hashCode() 和 equals()的若干问题解答

Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题&#xff1a; 1 equals() 的作用是什么&#xff1f; 2 equals() 与 的区别是什么&#xff1f; 3 hashCode() 的作用是什么&#xff1f; 4 hashCode() 和 equals() 之间有什么联系&#xff1f; …...

高级IO——React服务器简单实现

3.4Reactor服务器实现 1.connect封装 ​ 每一个连接都要有一个文件描述符和输入输出缓冲区&#xff0c;还有读、写、异常处理的回调方法&#xff1b; ​ 还包括指向服务器的回指指针&#xff1b; class connection; class tcpserver;using func_t std::function<void(s…...

Qt使用插件QPluginLoader 机制开发

简介&#xff1a; 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件&#xff1a; 一种高级API&#xff0c;用于为Qt本身编写插件&#xff1a;自定义数据库驱动程序&#xff0c;图像格…...

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

二百三十、MySQL——MySQL表的索引

1 目的 梳理一下目前MySQL维度表的索引情况&#xff0c;当然网上也有其他博客专门讲MySQL索引的&#xff0c;我这边只是梳理一下目前的索引状况而已 2单列索引 2.1 索引截图 2.2 建表语句 3 联合索引 3.1 索引截图 3.2 建表语句 4 参考的优秀博客 http://t.csdnimg.cn/ZF7…...

并发编程之ThreadLocal使用及原理

ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…...

KLite:轻量级嵌入式实时操作系统内核解析

KLite&#xff1a;一款简洁易用的嵌入式实时操作系统内核 1. 项目概述 1.1 系统定位 KLite是一款面向嵌入式领域的轻量级抢占式实时操作系统内核&#xff0c;采用MIT开源协议发布。该系统专为资源受限的微控制器设计&#xff0c;核心设计理念是保持功能完整性的同时&#xff…...

S3 文件操作进阶实践:从基础上传到完整性保障

1. S3文件操作的核心挑战与解决方案 第一次接触AWS S3时&#xff0c;很多人会觉得文件上传下载不就是调用几个API的事&#xff1f;但真正投入生产环境后&#xff0c;各种问题就会接踵而至。我见过最典型的案例是某电商平台在促销期间&#xff0c;因为文件上传没有做完整性校验…...

Win11Debloat实战指南:3步彻底清理Windows 11系统臃肿

Win11Debloat实战指南&#xff1a;3步彻底清理Windows 11系统臃肿 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改…...

告别蜗牛速度!优麒麟20.04 LTS换源华为云镜像保姆级教程

优麒麟20.04 LTS提速指南&#xff1a;华为云镜像配置全解析 每次在优麒麟上安装软件时&#xff0c;看着进度条像蜗牛一样缓慢前进&#xff0c;是不是让你感到无比焦虑&#xff1f;特别是当你急需某个工具完成工作时&#xff0c;漫长的等待简直让人抓狂。作为一款基于Ubuntu的国…...

ollama-QwQ-32B微调实战:定制OpenClaw专属指令集

ollama-QwQ-32B微调实战&#xff1a;定制OpenClaw专属指令集 1. 为什么需要定制OpenClaw指令集 去年冬天&#xff0c;当我第一次用OpenClaw自动整理桌面文件时&#xff0c;发现它总是把"截图"和"截屏"两个文件夹混在一起。这让我意识到&#xff1a;通用大…...

基于训练RBF神经网络的车速信息时序预测Matlab模型

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

基于MATLAB的数字图像处理系统:预处理、特征提取与语义分割全流程实现

数字图像处理系统&#xff08;基于matlab&#xff09; 此系统包括预处理&#xff0c;特征提取&#xff0c;语义分割 使用机器学习算法knn和svm 预处理包括线性灰度级变化&#xff0c;指数灰度级变化&#xff0c;直方图均衡化&#xff0c;高斯滤波&#xff0c;中值滤波&#xff…...

开源项目国际化:多语言配置全流程指南

开源项目国际化&#xff1a;多语言配置全流程指南 【免费下载链接】pivottable Open-source Javascript Pivot Table (aka Pivot Grid, Pivot Chart, Cross-Tab) implementation with dragndrop. 项目地址: https://gitcode.com/gh_mirrors/pi/pivottable 跨国团队如何让…...

OpenClaw+ollama-QwQ-32B内容处理:自动生成周报与会议纪要

OpenClawollama-QwQ-32B内容处理&#xff1a;自动生成周报与会议纪要 1. 为什么需要自动化内容处理工具 每周五下午三点&#xff0c;我的日历总会准时弹出"编写本周工作报告"的提醒。这个看似简单的任务&#xff0c;却常常让我陷入两难&#xff1a;要么花半小时手动…...

MCP项目笔记六(PluginsLoader)

C 插件加载器&#xff1a;从目录扫描、动态库加载、实例创建&#xff0c;到安全卸载的设计思路与实现细节。一、整体架构概览 这段代码实现了一个完整的运行时插件系统&#xff08;Runtime Plugin System&#xff09;。所谓插件系统&#xff0c;就是让主程序在编译完成后&#…...