我们可以使用say pre order traversal output构建唯一的二叉搜索树,如下所示:
这些事实很容易转换为代码。但是,我正在努力获得将级别顺序遍历输出转换为唯一二叉搜索树的严格事实/步骤。
例如,如果我有以下级别顺序遍历输出[5,4,8,1,7,2,6,3]
,我可以按如下方式形成BST:
5
/ \
4 8
/ /
1 7
\ /
2 6
\
3
级别顺序遍历中的第一个元素始终是根(级别0)。然后是第1级的元素.4小于5,所以我将它作为左子pf 5. 8大于5,所以我将它作为5的右孩子。(它不能是4的孩子,因为在那种情况下它应该小于5.因此它不能出现在2)级。然后是1和7. 1应该是4的孩子,因为它小于4. 7不能是4的右孩子,因为它也大于5。所以它应该在5的右子树上。因此,它必须是8的子,7<我们可以为所有人继续这样做。
我觉得这是正常的BST创作。也就是说,它通过在水平顺序输出的序列中在空BST中插入节点来创建BST。是吗?我的意思是有相同于上述步骤的步骤,如从预订序遍历输出构造唯一BST的情况。或者我们只需要遵循BST创建算法并在水平顺序遍历输出的序列中在空BST中插入节点?
答案 0 :(得分:1)
或者我们只需遵循BST创建算法并在水平顺序遍历输出的序列中在空BST中插入节点?
这可以更有效地完成(线性时间与Θ(n log(n))),但需要小心。在你的口头描述中 ,何时移动到父级别的新节点的问题需要更精确。
假设在构造树时,然后对于每个节点 v ,存储一个辅助变量 c(v),这是一个项目不能超过的临界值成为 v 的孩子。
当你开始时,用 c(5)=∞构造节点 5 (因为只有当某些东西大于∞它不是这个节点的孩子。)
下一项是1.由于 4< c(5)=∞,那么1可以是5的孩子;因为它较小,所以必须是左孩子。由于它是一个左子,它的截止值是父值,所以 c(4)= 5 。
下一项是8.再次, 8< c(5)=∞,所以它可以是一个孩子,但它必须是正确的孩子。由于它是正确的孩子,它的截止值是其父级的截止值,因此 c(8)=∞。
同样,1成为4的孩子,并将其截止水平定为4。
7不能是4的子级。它大于4的截止级别。我们继续前一级别的下一个节点,即8.它可能确实是8的子节点,并且成为它的左孩子,将8作为自己的截止水平。
继续如上:
如果节点位于上一级节点的截止值之下,则每个节点可以是上一级节点的子节点。如果没有,请转到上一级别的下一个节点作为候选者。
对于新节点小于截止值的上一级节点:
如果它小于节点,则它变为左子节点,并将父节点的值作为其截止值。
如果它大于节点,它就会成为一个正确的子节点,并将父节点的截止值作为自己的截止值。