我试图从二进制搜索树中删除节点.除了一个特定的情况,我可以成功删除树上的任何其他节点.如果目标节点有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相关推荐

  1. java 删除二进制内容_二进制搜索树节点删除

    我正在实现从二叉搜索树中删除节点的功能 . 该功能的原型已设置,我无法更改它,这是一项学校作业 . 我的代码: typedef struct tBSTNode { char Key; struct t ...

  2. java怎么清空一个文件内容_如何从文本文件中删除特定内容? - java

    我正在Java的SO的帮助下从事此项目的工作,正在读取一个文件夹,然后将其内容写入文件.然后,我需要浏览该内容,仅保留末尾带有Thumbnail.jpg的图像. 编辑: public static f ...

  3. vi删除选中内容_如何优雅的删除代码-VIM

    删代码一时爽,一直删一直爽. 删除应该是编码过程中非常高频率的操作了,不用vim的时候,一般就是选中删除或者跳到目标位置一直按Backspace或者Delete.而在vim中,你可以有上百中删除的姿势 ...

  4. java 删除桌面快捷方式_能否在桌面创建快捷方式运行java程序?

    能否在桌面创建快捷方式运行java程序? 来源:互联网  宽屏版  评论 2009-05-07 07:51:17 分类: 电脑/网络 >> 程序设计 >> 其他编程语言 问题描 ...

  5. java局域网聊天代码_简单的局域网聊天程序(java版本的)

    局域网聊天程序,首先我已经默认你的电脑已经配置好的java开发的一些环境,所需代码有两个java的源代码,他们分别是1:Server_Test.java-------2:Socket_Test.jav ...

  6. java高深技术总结_一名25K以上的高薪Java程序员总结出的技术以及学习技能

    原标题:一名25K以上的高薪Java程序员总结出的技术以及学习技能 总所周知,Java是目前使用最为广泛的网络编程语言之一. 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点. 一般 ...

  7. java增删改查_只会增删改查的Java程序员该如何发展

    首先,对于当前的Java程序员来说,要想在软件开发领域走得更远,应该做好三件事,其一是为自己设定一个主攻方向,其二是根据自身的知识基础和能力特点来制定学习计划,其三是注重行业发展趋势,积极拥抱新技术. ...

  8. iphone照片永久删除怎么恢复_微信数据怎么永久删除不被恢复?只删除聊天记录没用,打开这里彻底删除!...

    微信数据怎么永久删除不被恢复?这个问题已经越来越让人头疼,似乎单纯的删掉与对方的对话框已经不能再让人放心,微信里有太多不想被人知道的隐私,不管是工作还是生活,学会彻底删除微信聊天记录,已经越来越重要. ...

  9. java职业发展路线图_从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...

    http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...

最新文章

  1. Linux基础操作优化
  2. CentOS上Nginx服务器安装phpmyadmin
  3. php 文件管理系统_如何编写程序实现图书管理系统的个人图书借阅查询功能
  4. 表单提交时有的字段可以传递到后台有的不可以
  5. idea使用 git 撤销commit
  6. 经典面试题(7):下面的代码运行结果是什么么?
  7. mysql执行效率低_如何查询mysql中执行效率低的sql语句
  8. ajax成功跨域_自己写的
  9. matlab 画图直接存储_Matlab Figure图形保存
  10. 如何进行需求矩阵管理
  11. 【产品】外壳防护等级(IP代码)
  12. linux centos无线网卡驱动安装,CentOS 6.5 安装无线网卡驱动实现无线上网
  13. cfree5c语言编写贪吃蛇,刚学C语言,想写一个贪吃蛇的代码
  14. 【学习记录】基于知识图谱的虚假新闻检测
  15. hp服务器pe系统安装win7系统教程,惠普星 x360 u盘重装win7图文教程
  16. python cv2截取不规则区域图片
  17. 计算机网络常见面试题,一网打尽!
  18. 读懂2014年全球互联网广告新生态
  19. TLP(Transmission Line Pulse)
  20. 基于Matlab App Designer的语音信号分析与处理(二):IIR和FIR滤波器的设计,语音信号的滤波

热门文章

  1. 电商促销海报设计技巧!
  2. oracle字体加粗函数_Oracle日期操作函数
  3. python程序设计实验指导书_“Python程序设计”实验指导书.pdf
  4. mysql表空间不足_MySQL Innodb表空间不足的处理方法 风好大
  5. python matplotlib_高效使用 Python 可视化工具 Matplotlib
  6. 居家隔离14+7天的第三天 2021年8月1日15:49:09
  7. Kernel Samepage Merging | 同页合并
  8. GCC帧指针的开启与关闭以及反汇编测试
  9. 监督式学习、 非监督式学习、强化学习
  10. java 判断是不是微信打开_Java判断浏览器是微信还是支付宝