Java,二叉树删除方法

标签 java tree binary-tree

我正在尝试为已排序的二叉树编写一个 remove(node cRoot, Object o) 函数。

这是我目前所拥有的:

private boolean remove(Node cRoot, Object o) {
  if (cRoot == null) {
    return false;
  }
  else if (cRoot.item.equals(o)) { 
    //erase node fix tree
    return true;
  }
  else if (((Comparable)item).compareTo(cRoot.item)<=0){
    return remove(cRoot.lChild, o);
  }
  else { 
     return remove(cRoot.rChild,o);
  }
}

它不能正常工作。要删除节点,您必须修复树以修复漏洞。应该怎么做?

最佳答案

通常有两种方法可以对树执行删除操作:

第一种方法:

删除节点,然后用任一子节点替换它。然后,通过父子交换对树进行排序,直到树再次排序。

第二种方法:

遍历树找到属于根*的下一个(最高或最低)值,如果它是叶节点,则将其与根交换,然后修剪掉要删除的值。如果它是一个内部节点,您将不得不在该节点上递归调用 remove。重复直到移除一个叶节点。

*我的意思是,如果您将 BST 转换为排序列表,那么您将需要选择根左侧或右侧的值作为新根。 IE。右子树的最左子树,或左子树的最右子树。

关于Java,二叉树删除方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/836212/

相关文章:

java - 是什么导致此代码中的 ArrayIndexOutOfBounds 错误?

algorithm - Prolog程序,这个程序应该做什么?

algorithm - 如何证明堆: node i-th have 2 child are 2i-th and 2i+1-th?的子节点公式

c - 如何比较二叉树中的根路径和叶路径

java - 如何为具有复合主键和外键的 oneToMany 关系创建 Hibernate 映射文件?

java - java.sql.PreparedStatement 的 setBoolean() 方法

java - GAE哪个更适合全局系统内容?

Java继承而不强制转换

algorithm - 二叉树中最长的路径,最多一圈

java - 如何在 Spring 中将依赖项注入(inject)到自实例化的对象中?