将空二叉树填充为二叉搜索树而不改变结构(节点链接)

Posted

技术标签:

【中文标题】将空二叉树填充为二叉搜索树而不改变结构(节点链接)【英文标题】:Filling empty Binary tree as Binary search tree without changing structure (Node linkage) 【发布时间】:2016-06-13 12:18:59 【问题描述】:

我今天接受了面试,并被要求编写此代码.. 您已经创建了一个无序二叉树,在任何节点中都没有数据。 我们有一个具有相同数量元素的数组。 我们必须在不改变二叉树结构的情况下将数据作为二叉搜索树插入二叉树。

我想出的方法是对数组进行排序,然后逐个遍历其元素,将每个数据元素放在树中第一个空的中序节点中。 但我想这是不正确的,因为我没有被选中。

抱歉,如果不允许使用算法问题。如果有这样的问题,我会删除它......

【问题讨论】:

嗯,这是一个有趣的问题,二叉树的结构是否完整/完整?我觉得给定任意结构的二叉树是不可能确保结构保持不变的,除非它是完整的或完整的 你好 NickZumber- 面试官画了一棵树,它不完整。甚至没有为此订购。 我觉得这里要么缺少信息,要么我很难理解这个问题(很可能是后者)。希望有人找到解决方案 - 我很好奇 Nick- 好吧,我不认为这有什么遗漏。如果我错了,请纠正我。很简单。我们必须在二叉树中插入元素作为 BST。例如,左子树中的较小元素和右子树中的较大元素。 你说得对——这个理论在实践中似乎行不通,但我只是模拟了一些问题,它就行了!在这个解决方案上做得很好 - 我确定公司是否要求你回来参加另一次面试,你做得很好;)祝你好运! 【参考方案1】:

没错,当你对数组进行排序并按顺序将其放入不可更改的树中时,树就被正确填充了。 但也许有更好的方法来解决这个任务......没有排序,或者另一个问题是错误的......对不起

【讨论】:

嗨 Thomas- 是的,我也这么认为。因为我一次又一次地经历了试运行,对我来说它看起来很可靠。所以也许我在编码方面搞砸了,或者像你说的那样,有更好的方法。 我为你感到难过......但是大学里大多数人都不会通过这个问题......所以我认为你很快就会找到一份好工作!祝你好运! 哈哈,谢谢托马斯。他们让我再次来面试,所以让我们希望最好。我会将您的答案标记为正确答案,因为我认为没有比这更多的答案了。【参考方案2】:

假设数据项之间只允许进行<> 比较,您的解决方案不仅正确,而且不可能做得更好(在渐近意义上)。

您的解决方案涉及对数据进行排序,这需要时间 O(n log n),然后以有序遍历的方式将其插入到树中,这需要时间 O(n),总体时间复杂度为 O( n 记录 n)。请注意,在构建二叉搜索树之后,我们可以使用中序遍历按排序顺序读取其所有数据——也就是说,解决面试官的问题可以用于排序任何给定的数据元素。

现在假设相反,实际上有一些算法可以在 o(n log n) 时间内解决面试官的问题——也就是说,其时间复杂度比你给出的算法要好得多。然后可以使用该算法以严格优于 O(n log n) 的时间对给定数据进行排序。但我们知道这是不可能的——O(n log n) 是排序 n 个元素所需时间的下限,如果我们可以对它们做的只是使用<> 比较它们。因此没有这样更好的算法存在。

请注意,如果我们假设输入值是由某个常数限制的小整数,则此界限将不成立,因为像基数排序这样的操作可以在 O(n) 时间内执行排序。

【讨论】:

以上是关于将空二叉树填充为二叉搜索树而不改变结构(节点链接)的主要内容,如果未能解决你的问题,请参考以下文章

js 数据结构 树(二叉搜索树的实现)

Python算法系列—深度优先遍历算法

Leetcode 108 将有序数组转换为二叉搜索树

平衡二叉树---将有序数组转换为二叉搜索树

Leetcode练习(Python):树类:第108题:将有序数组转换为二叉搜索树:将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的

LeetCode-树将有序数组转换为二叉搜索树