我正在阅读this article,其中提到我们可以通过以特定方式执行旋转来摆脱树的一侧,然后沿一个方向向下遍历树并删除元素。
虽然我明白他们想要做什么,但我不明白为什么?
这种类型的删除提供了哪些优势而不是简单的延期删除?
我能想到的一个优点是节省了递归所使用的内存,但我认为与遍历树两次相比,一次是旋转,然后是删除,这是一个微不足道的开销。我在这里错过了什么吗?
答案 0 :(得分:3)
这篇文章似乎坚持认为这个方法的目的是避免递归(以及它对堆栈空间的消耗):“嗯...如果我们重新排列节点以便它们没有任何左子树怎么办呢?那么我们可以向右下降,而不需要跟踪堆栈中的任何内容。“
一般情况下,当我无法确定其深度是否合理时,我宁愿避免递归,因为在用完任何其他类型的内存之前,你将耗尽堆栈空间 - 在某些情况下因为系统是旨在限制递归以捕获导致无限递归的错误。但是,我认为这里不太重要,你已经承认同一个包中的其他例程需要递归。此外,递归的深度取决于树的深度,对于平衡树,这将大致是它的节点数的对数,因此不应该太深。