【发布时间】:2017-03-09 16:36:48
【问题描述】:
我不太确定如何为二叉搜索树选择根(我希望不使用任何代码):
5、9、2、1、4、8、3、7、6
如何选择根?
这个算法的步骤让我很困惑。
【问题讨论】:
-
当你说“这个算法”时,你脑海中是否有一个特定的算法? (我问是因为没有一种众所周知的选择根的方法。)
标签: algorithm data-structures binary-search-tree
我不太确定如何为二叉搜索树选择根(我希望不使用任何代码):
5、9、2、1、4、8、3、7、6
如何选择根?
这个算法的步骤让我很困惑。
【问题讨论】:
标签: algorithm data-structures binary-search-tree
您可以初始化一个空的 BST(二叉搜索树),然后迭代列表并插入每个项目。
您无需选择根,只需构建树即可。但也许你想要平衡树,你可以将列表的中间值作为第一个元素插入,但正确的答案是使用平衡二叉搜索树(AVL 树)。
【讨论】:
中位数将是更好的选择,因为您希望深度更小。 下面是一个例子,根是求中位数,下一个也是求中位数
5
3 8
2 4 7 9
1 6
5 是由 (1+9)/2 得到的。 3 get from ceiling(1+4)/2 (也可以选择中位数的下限作为选择中位数根的作用)
【讨论】:
具有相同值的 BST 可以有多种形式。例如,包含 1,2 的树可以是:
1 <- root
\
2 <-- right son
或
2 <- root
/
1 <-- left son
所以你可以有一棵树,其中 1 是根,它是 1->2->3... 并且没有左子。您可以将 5 作为根,分别将 4 和 6 作为左右子,并且您可以拥有许多其他具有相同值但排序不同(可能是不同的根)的树
【讨论】:
如何选择根?
随心所欲。任意数量的数据都可以作为根。
您希望选择中位数,在本例中为 5。通过该选择,您的树应该尽可能平衡,5 左侧的四个节点和 5 的右子树中的四个节点。
请注意,any 元素可能是 rood(甚至是随机选择,或者您示例中的第一个数字)。
嗯,那我为什么要担心找到中位数而不总是选择第一个数字(最简单的选择)?
因为您希望二叉搜索树 (BST) 尽可能平衡。
如果您选择最小或最大数字作为根,那么您的树将达到其最大深度(最坏情况),并将模拟单个链表,这将导致搜索算法出现最坏情况也是。然而,正如 Michel 所说,为根选择最小或最大项不一定会导致退化树。例如,如果您为根选择了最小项,但包含其余项的右分支是平衡的,则树的高度仅比最佳值高一级。如果您按升序或降序选择节点,则只会得到一棵退化树。
请记住,在 BST 中,必须遵守此规则:
左子节点小于父节点并且 所有正确的子节点都大于父节点。
更多信息,请阅读How binary search tree is created??
【讨论】: