Tree 在不反转列表的情况下,从深度优先顺序的列表构建BST

Tree 在不反转列表的情况下,从深度优先顺序的列表构建BST,tree,binary-search-tree,Tree,Binary Search Tree,从深度优先后序元素列表重建BST的最简单方法是首先反转列表,然后使用从前序构建树的算法的轻微修改来构建树。不幸的是,如果列表实际上是一个(有限的)流,那么这样做的内存需求可能会令人望而却步,效率肯定会被忽略。因此,找到一种更为渐进的方法来实现这一点将是非常有趣的 当然,问题是查看后序遍历的前几个元素不一定能告诉您关于树的形状的很多信息。如果你看到[2,1,…],那么你知道你有一个根为1,右叶为2的子树,但是如果你看到1,2,那么你可以得出很少的结论。我的一个想法是,也许一种不确定的解析技术可以做

从深度优先后序元素列表重建BST的最简单方法是首先反转列表,然后使用从前序构建树的算法的轻微修改来构建树。不幸的是,如果列表实际上是一个(有限的)流,那么这样做的内存需求可能会令人望而却步,效率肯定会被忽略。因此,找到一种更为渐进的方法来实现这一点将是非常有趣的

当然,问题是查看后序遍历的前几个元素不一定能告诉您关于树的形状的很多信息。如果你看到[2,1,…],那么你知道你有一个根为1,右叶为2的子树,但是如果你看到1,2,那么你可以得出很少的结论。我的一个想法是,也许一种不确定的解析技术可以做到这一点,但我不能完全正确地理解这一点,也不能找到避免坏情况的方法


注意:如果答案包括代码,如果所说的代码是Haskell、Scheme或SML,那就更好了。

流是否已经按特定顺序排列,或者元素的顺序是随机的?@RobertHarvey流是按深度优先顺序排列的。我想我的上一次编辑澄清了这个问题。实际上,如果你使用自平衡树,我认为输入顺序根本不重要。@RobertHarvey,目标是找回原始树。也就是说,给定一个函数f,它接受一个二叉搜索树并生成一个深度优先的节点列表,我们想要生成一个函数g,这样g。f=id。是否存在节点以错误顺序写入的原因,或者这只是一个疏忽?原来的问题可以纠正吗?