我不太确定如何为二叉搜索树选择一个根(我想要没有任何代码):
5,9,2,1,4,8,3,7,6
如何选择根?
这个步骤让我对此算法感到困惑。
答案 0 :(得分:2)
您可以初始化一个空的BST(二叉搜索树),然后迭代列表并插入每个项目。
您不需要选择根,只需构建树。但也许你想要平衡树,你可以作为第一个元素插入列表的中间值,但正确的答案是使用平衡的二叉搜索树(AVL树)。
答案 1 :(得分:1)
中位数将是更好的选择,因为您希望减少深度。 这是一个例子,根是找到中位数,下一个也找到中位数
5
3 8
2 4 7 9
1 6
5是(1 + 9)/ 2。 3从天花板(1 + 4)/ 2(你也可以选择中位数作为选择中位根的角色)
答案 2 :(得分:0)
如何选择根?
以你想要的方式。您的任何数据都可以是根。
你想选择中位数,在这种情况下,5。通过这个选择,你的树应该得到平衡,5左边的四个节点和右子树5的4个节点。 / p>
请注意,任何元素都可以作为结果(即使是随机选择,也可以是示例中的第一个数字)。
嗯,那我为什么要担心找到中位数而不总是选择第一个数字(最简单的选择)?
因为您希望二进制搜索树(BST)尽可能平衡。
如果您选择最小或最大数字作为根,那么您的树将达到其最大深度(最坏情况),并将模拟单个链表,这将导致搜索算法的最坏情况同样。然而,正如Michel所说,为根获取最小或最大项目不一定会导致退化树。例如,如果您选择了根的最小项目,但是包含其余项目的右侧分支是平衡的,那么树的高度只比最佳值高一个级别。如果您按升序或降序选择节点,则只会得到退化树。
请记住,在BST中,必须遵守此规则:
左子节点小于父节点和 所有孩子都比父节点大。
有关详情,请参阅How binary search tree is created??
答案 3 :(得分:0)
具有相同值的BST可以有多种形式。例如,包含1,2的树可以是:
1 <- root
\
2 <-- right son
或
2 <- root
/
1 <-- left son
所以你可以有一棵树,其中1是根,它是1-> 2&gt; 3 ...而没有左儿子。您可以将5作为根,4和6分别作为左右儿子,并且您可以使许多其他树具有相同的值,但不同的顺序(可能是不同的根)