我正在尝试为已排序的二叉树编写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转换为排序列表,则需要选择根左侧或右侧的值作为新根。即右子树的最左子节点,或左子树的最右子节点。

09-12 11:50