假设前n个自然数作为BST的关键,我如何确定所有可能树的根节点,其高度为' h'
我已经想出了一个强力方法,我用n个节点构造了所有可能的树,然后选择了高度为h的树,但它的时间复杂度几乎为O(n!)。有人可以建议一种更有效的方法吗?
答案 0 :(得分:1)
问题陈述。根据自然数n
和h
,确定root
中的所有元素1..n
,root
是1..n
高度为h
的二叉搜索树的根。
解决方案。我们可以在1..n
上从1..n
中的任意数字开始构建简并二元搜索树,方法是在root
处将其拆分。这会将旧解决方案的下限更改为h-1
,而上限保持不变,呈现完整边界如下:
h-1 <= max(root-1, n-root) <= 2^h - 1
旧解决方案(仅对完整二进制树正确)。 A full binary tree with height h
has at least 2h+1
nodes, and at most 2^(h+1)-1
nodes。很容易看出这些边界很紧,不仅适用于二叉树,也适用于二叉搜索树。特别是,它们适用于left
的{{1}}和right
子树。由于这是root
上的二叉搜索树,因此1..n
恰好包含元素left
,而1..(root-1)
恰好包含元素right
。< / p>
这意味着以下是必要且充分的条件:子树(root+1)..n
和left
的更大必须满足不等式
right
换句话说,2*(h-1) + 1 <= nodes(subtree) <= 2^h - 1
的可能值恰好是root
满足
1..n
更新。我盲目地看着我在维基百科上发现的不平等,却没有意识到它只适用于完整的二叉树。