一尘不染

平衡BST

algorithm

参考: 有人问我这个问题,@ MS SDE第三轮采访。这不是家庭作业的问题。我也考虑了一下,并在下面提到了我的方法。

问题: 修改BST,使其尽可能平衡。不用说,您应该做到尽可能高效。

提示: 采访者说这是一个合乎逻辑的问题,如果您以不同的方式思考,您将得到答案。不涉及困难的编码。
->话虽如此,我认为他不希望我指着AVL / RB树。

我的解决方案:
我提议,我将对树进行有序遍历,将中间元素作为新树的根(我们称其为新根)。然后转到中间元素的左侧,将其中间元素作为以树为根的新根的左子树的根。正确地做同样的事情。递归执行此操作将提供最佳的平衡BST。

为什么在这里发布它: 但是他对答案不满意:(因此,真的有一种方法可以不使用权重/ RB着色策略吗?还是他只是在和我鬼混?您的专家意见。


阅读 238

收藏
2020-07-28

共1个答案

一尘不染

您可能需要研究 Day-Stout-Warren算法,该算法是O(n)时间,O(1)空间算法,用于将任意二进制搜索树重塑为完整的二进制树。直观上,该算法的工作方式如下:

  1. 使用树旋转,将树转换为简并链表。
  2. 通过对链表进行选择性旋转,将链表转换回完全平衡的树。

该算法的优点在于它可以线性运行,并且只需要恒定的内存开销。实际上,它只是重塑了基础树,而不是创建新树并复制旧数据。编写代码也相对简单。

希望这可以帮助!

2020-07-28