下面的一些代码似乎太明显了,使用最右边的分支遍历树,因为这是所有最大值的地方。但是,我不明白我在Robert Sedgewick的算法书中看到的关于这个代码的一些事情
public void deleteMax() {
if (isEmpty()) throw new NoSuchElementException("");
root = deleteMax(root);
assert check();
}
private Node deleteMax(Node x) {
if (x.right == null) return x.left;
x.right = deleteMax(x.right);
x.size = size(x.left) + size(x.right) + 1;
return x;
}
在私有方法中,如果x的右子元素为空,为什么我们返回左元素?从我的理解中,如果x没有正确的子元素,x将是最大值,并且是我们可以去的最正确的节点。也是我不明白我们什么时候在第二种方法的最后一行返回x。
答案 0 :(得分:0)
如果x
没有合适的孩子,则x
是最大节点。我们"删除"返回x.left
(新的最大节点)。在我们修改了正确的子树后,我们会返回x
。