我想了解更多关于二叉树的知识,并且我遇到了关于如何找到后继节点(当试图删除节点时)的方法,但我很难理解它的一部分。 这是代码。这段代码为什么需要从BST中删除?
private Node getSuccessor(Node delNode){
Node successorParent = delNode;
Node successor = delNode;
Node current = delNode.rightChild;
while(current != null){
successorParent = successor;
successor = current;
current = current.leftChild;
} // end of if
if(successor != delNode.rightChild){
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}
我完全理解了while循环以及那里的内容。我不明白的是if语句,特别是...
successor.rightChild = delNode.rightChild;
我为什么要将delNode的右侧子项分配给后继节点的右侧子项?为什么if语句是必要的?
你自己想出这个最简单的方法就是运行代码并观察两者之间的区别。 – Carcigenicate
说实话,没有仔细阅读核心*,这看起来不像任何普通的“在二叉树中找到任何东西”的实现,因为它**修改了树。然而,一个splay树通过将查询的节点移动到树顶部来修改树,但是问题中的代码还不足以实现这一点。 –
@Carcigenicate这是真的!我会尽力做到这一点。 –