参考: 有人问我这个问题,@ MS SDE第三轮采访。这不是家庭作业的问题。我也考虑了一下,并在下面提到了我的方法。
问题: 修改BST,使其尽可能平衡。不用说,您应该做到尽可能高效。
提示: 采访者说这是一个合乎逻辑的问题,如果您以不同的方式思考,您将得到答案。不涉及困难的编码。 ->话虽如此,我认为他不希望我指着AVL / RB树。
我的解决方案: 我提议,我将对树进行有序遍历,将中间元素作为新树的根(我们称其为新根)。然后转到中间元素的左侧,将其中间元素作为以树为根的新根的左子树的根。正确地做同样的事情。递归执行此操作将提供最佳的平衡BST。
为什么在这里发布它: 但是他对答案不满意:(因此,真的有一种方法可以不使用权重/ RB着色策略吗?还是他只是在和我鬼混?您的专家意见。
您可能需要研究 Day-Stout-Warren算法,该算法是O(n)时间,O(1)空间算法,用于将任意二进制搜索树重塑为完整的二进制树。直观上,该算法的工作方式如下:
该算法的优点在于它可以线性运行,并且只需要恒定的内存开销。实际上,它只是重塑了基础树,而不是创建新树并复制旧数据。编写代码也相对简单。
希望这可以帮助!