问题描述
想检查是否有一种方法可以仅从按排序顺序的中序遍历构造二叉搜索树。我想可能有一些方法可以递归地进行,但无法弄清楚。任何指针将不胜感激。
解决方法
一个 BST 正好有一个中序遍历,但是一个给定的中序遍历可以构造多个 BST。因此,是的,可以使用给定的中序遍历构造 BST,但您最终可能不会得到与您开始的中序遍历相同的树。
查看这篇文章了解更多信息:https://www.geeksforgeeks.org/find-all-possible-trees-with-given-inorder-traversal/
,是的,可以从中序遍历构造二叉搜索树。
观察二叉搜索树的中序遍历总是排序的。
有许多可能的结果,但人们可能对生成尽可能平衡的树特别感兴趣,以便在其中进行高效搜索。产生低效二叉搜索树的一种方法是在最后插入的节点的右侧不断添加新节点。然后生成的二叉搜索树倾斜。
例如,如果中序遍历是 1,2,3,4,5,6,我们将得到这棵树:
1
\
2
\
3
\
4
\
5
\
6
这对二叉搜索树的帮助不大,因为它确实退化为单链,并且在该树中进行搜索并不比在输入数组中从左到右进行搜索更好。
更有效的替代方法是二叉搜索树,它具有相同的中序遍历:
3
/ \
2 5
/ / \
1 4 6
算法
生成相当平衡的二叉搜索树的算法确实可以是递归的:
- 如果给定的数组(遍历)为空返回
null
(空树) - 取给定数组的中间值(遍历)并为其创建一个节点。
- 取所选数组值左边的子数组,对其递归执行算法。这将返回一个节点(以子树为根),该节点应作为在步骤 2 中创建的节点的左子节点附加。
- 取所选数组值右侧的子数组,对其递归执行算法。这将返回一个节点(以子树为根),该节点应作为在步骤 2 中创建的节点的右子节点附加。
- 返回第 2 步中创建的节点。