当在二叉搜索树中搜索键值60时,遍历包含键值10,20,40,50,70,80,90的节点,不一定按给定的顺序。在从根到包含值60的节点的搜索路径上,这些键值可能出现多少个不同的顺序?
答案:7!/(3!4!)
我不知道他们是如何得出答案的。
我可以提出以下两件事
10
\
20
\
40
\
50
\
70
\
80
\
90
/
60
和
90
/
80
/
70
/
10
\
20
\
30
\
40
\
50
\
60
当我尝试其他一些事情时,我无法通过访问所有给定的值从根到跟随包含60的节点。
e.g。
50
/ \
40 90
/ /
20 80
/ /
10 70
/
60
在上面的示例中,我只能按顺序访问50,90,80,70,60,而省略10,20和40。那么答案是如何形成的呢?
也许我无法理解这个问题。也许不需要访问所有节点。在那种情况下如何提出解决方案?
答案 0 :(得分:2)
这是一个小小的思想实验:根据所提供的信息,BST的根可能保持值20吗?如果是这样,您将继续在搜索60(从60> 20)中移动到右侧子树,但在这种情况下,您将永远不会看到值10,因为10必须在左子树中!
同样,树的根可能是80?如果是这样,在搜索60时,您将在第一步(60< 80)中向左移动,但之后您永远不会看到90,因为90在左子树中!
这向我们展示了我们的树根发生了一些有趣的事情。如果我们在搜索60上看到所有这些值,并非所有这些值都可以作为BST的根。
那么可以我们看作什么?一种选择是看10.由于集合中的所有剩余值都大于10,因此不能排除任何内容。另一个选项是90,因为集合中的所有剩余值都小于90。
我们现在可以询问关于在查看根之后我们进入的子树的根的相同问题。我们必须要么看到最大的剩余值,要么看到剩下的最小值,否则(使用类似的推理)我们会切断一些我们应该看到的值。
更一般地说,我们看到的每个值都需要是(1)大于60的最大值或(2)小于60的最小值。任何其他值都不会起作用并且会削减某些值。
在提供的值中,其中四个(10,20,40,50)小于60,其中三个(70,80,90)大于60.正如我们搜索60,at我们需要从每个点中选择第一组中的最小值或第二组中的最大值作为我们在树搜索中看到的下一个值。因此,我们可以想象可能搜索60作为Ls和Rs的字符串,其中R表示从左组中选择最小值"并且L表示从正确的组中选择最大值。"例如,RRRRLLL将为我们提供此搜索路径:
10
\ R
20
\ R
40
\ R
50
\ R
90
/ L
80
/ L
70
/ L
60
序列RLRLRLR会给我们
10
\ R
90
/ L
20
\ R
80
/ L
40
\ R
70
/ L
50
\ R
60
所以我们整体问题的答案现在如下:你可以用多少种方法制作4个R&3和3个L&#39?答案是7选4(也等于7选3):我们的字符串中有七个位置,我们可以选择其中四个为R,其余为L或其中三个为L,其余为是R.这可以达到7! /(4!3!),与您看到的答案相符。