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