java 删除二进制内容_二进制搜索树节点删除不删除替换Java
我试图从二进制搜索树中删除节点.除了一个特定的情况,我可以成功删除树上的任何其他节点.如果目标节点有2个子节点,并且左子节点具有右子树,我可以找到正确的替换节点并将值切换到目标节点,但是永远不会删除替换节点.
看看上面的图片,如果我尝试删除17,程序将正确导航到13并用13替换17,但它不会删除原来的13,因为它应该.
我附上了我的删除方法和其中引用的方法.
public Node root;
public void delete(int value){
Node node = new Node<>(value);
Node temp;
if(root == null) {
System.out.println("The tree is already empty!"); //tree is empty
return;
}
if (root.value == node.value) { //Root is target value
temp = node.left;
if(temp.right == null){
node.value = temp.value;
temp = null;
}
else{
while(temp.right != null){
temp = temp.right;
}
node.value = temp.value;
temp = null;
}
return;
}
deleteRec(root, node);
}
private void deleteRec(Node lastRoot, Node node){
Node temp;
if (lastRoot.value >= node.value){
if (lastRoot.left.value == node.value){
node = lastRoot.left;
if(node.left == null && node.right == null){ //No children
node = null;
lastRoot.left = null;
}
else if(node.left == null && node.right != null){ //Right Child
lastRoot.left = node.right;
node = null;
lastRoot.left = null;
}
else if(node.left != null && node.right == null){ //Left Child
lastRoot.left = node.left;
node = null;
}
else{ //Two Children
if(node.left.right == null){
node.value = node.left.value;
node.left = node.left.left;
node.left = null;
}
else{
node = findReplacement(node.left);
lastRoot.left.value = node.value;
node.left = null;
}
}
}
else{
deleteRec(lastRoot.left, node);
}
}
else{
if (lastRoot.right.value == node.value){
node = lastRoot.right;
if(node.left == null && node.right == null){ //No Children
node = null;
lastRoot.right = null;
}
else if(node.left == null && node.right != null){ //Right Child
lastRoot.left = node.right;
node = null;
lastRoot.right = null;
}
else if(node.left != null && node.right == null){ //Left Child
lastRoot.right = node.left;
node = null;
}
else{ //Two Children
if(node.left.right == null){
node.value = node.left.value;
node.left = node.left.left;
node.left = null;
}
else{
node = findReplacement(node.left);
lastRoot.left.value = node.value;
node.left = null;
}
}
}
else{
deleteRec(lastRoot.right, node);
}
}
}
private Node findReplacement(Node node) {
while(node.right != null){
node = node.right;
}
return node;
}
这是我的Node类:
public class Node {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int value) {
this.value = value;
}
}
最佳答案 考虑这部分代码:
Node rep = findReplacement(node.left);
node.value = rep.value;
rep = null;
你找到了替代品,并让代表指向它.然后,基本上你正在做的是使rep指向null.这不会删除节点!父母仍然指着它!
您的代码中有几个地方沿着这些方向做某事.在Java实现中,您希望从树中删除节点的方式是更改父项指向的内容.垃圾收集器负责其他细节.我希望解决这个问题可以帮助您解决问题!
java 删除二进制内容_二进制搜索树节点删除不删除替换Java相关推荐
- java 删除二进制内容_二进制搜索树节点删除
我正在实现从二叉搜索树中删除节点的功能 . 该功能的原型已设置,我无法更改它,这是一项学校作业 . 我的代码: typedef struct tBSTNode { char Key; struct t ...
- java怎么清空一个文件内容_如何从文本文件中删除特定内容? - java
我正在Java的SO的帮助下从事此项目的工作,正在读取一个文件夹,然后将其内容写入文件.然后,我需要浏览该内容,仅保留末尾带有Thumbnail.jpg的图像. 编辑: public static f ...
- vi删除选中内容_如何优雅的删除代码-VIM
删代码一时爽,一直删一直爽. 删除应该是编码过程中非常高频率的操作了,不用vim的时候,一般就是选中删除或者跳到目标位置一直按Backspace或者Delete.而在vim中,你可以有上百中删除的姿势 ...
- java 删除桌面快捷方式_能否在桌面创建快捷方式运行java程序?
能否在桌面创建快捷方式运行java程序? 来源:互联网 宽屏版 评论 2009-05-07 07:51:17 分类: 电脑/网络 >> 程序设计 >> 其他编程语言 问题描 ...
- java局域网聊天代码_简单的局域网聊天程序(java版本的)
局域网聊天程序,首先我已经默认你的电脑已经配置好的java开发的一些环境,所需代码有两个java的源代码,他们分别是1:Server_Test.java-------2:Socket_Test.jav ...
- java高深技术总结_一名25K以上的高薪Java程序员总结出的技术以及学习技能
原标题:一名25K以上的高薪Java程序员总结出的技术以及学习技能 总所周知,Java是目前使用最为广泛的网络编程语言之一. 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点. 一般 ...
- java增删改查_只会增删改查的Java程序员该如何发展
首先,对于当前的Java程序员来说,要想在软件开发领域走得更远,应该做好三件事,其一是为自己设定一个主攻方向,其二是根据自身的知识基础和能力特点来制定学习计划,其三是注重行业发展趋势,积极拥抱新技术. ...
- iphone照片永久删除怎么恢复_微信数据怎么永久删除不被恢复?只删除聊天记录没用,打开这里彻底删除!...
微信数据怎么永久删除不被恢复?这个问题已经越来越让人头疼,似乎单纯的删掉与对方的对话框已经不能再让人放心,微信里有太多不想被人知道的隐私,不管是工作还是生活,学会彻底删除微信聊天记录,已经越来越重要. ...
- java职业发展路线图_从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...
http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...
最新文章
- Linux基础操作优化
- CentOS上Nginx服务器安装phpmyadmin
- php 文件管理系统_如何编写程序实现图书管理系统的个人图书借阅查询功能
- 表单提交时有的字段可以传递到后台有的不可以
- idea使用 git 撤销commit
- 经典面试题(7):下面的代码运行结果是什么么?
- mysql执行效率低_如何查询mysql中执行效率低的sql语句
- ajax成功跨域_自己写的
- matlab 画图直接存储_Matlab Figure图形保存
- 如何进行需求矩阵管理
- 【产品】外壳防护等级(IP代码)
- linux centos无线网卡驱动安装,CentOS 6.5 安装无线网卡驱动实现无线上网
- cfree5c语言编写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
- 【学习记录】基于知识图谱的虚假新闻检测
- hp服务器pe系统安装win7系统教程,惠普星 x360 u盘重装win7图文教程
- python cv2截取不规则区域图片
- 计算机网络常见面试题,一网打尽!
- 读懂2014年全球互联网广告新生态
- TLP(Transmission Line Pulse)
- 基于Matlab App Designer的语音信号分析与处理(二):IIR和FIR滤波器的设计,语音信号的滤波
热门文章
- 电商促销海报设计技巧!
- oracle字体加粗函数_Oracle日期操作函数
- python程序设计实验指导书_“Python程序设计”实验指导书.pdf
- mysql表空间不足_MySQL Innodb表空间不足的处理方法 风好大
- python matplotlib_高效使用 Python 可视化工具 Matplotlib
- 居家隔离14+7天的第三天 2021年8月1日15:49:09
- Kernel Samepage Merging | 同页合并
- GCC帧指针的开启与关闭以及反汇编测试
- 监督式学习、 非监督式学习、强化学习
- java 判断是不是微信打开_Java判断浏览器是微信还是支付宝