Math 在给定值的BST查找中,我们可以通过多少种不同的方式查看这些特定值?

Math 在给定值的BST查找中,我们可以通过多少种不同的方式查看这些特定值?,math,data-structures,binary-search-tree,traversal,combinatorics,Math,Data Structures,Binary Search Tree,Traversal,Combinatorics,当在二元搜索树中搜索键值60时,不必按照给定的顺序遍历包含键值10、20、40、50、70、80、90的节点。这些键值在从根到包含值60的节点的搜索路径上可能出现多少不同的顺序 回答:7/(3!4!) 我不知道他们是怎么想出答案的 我可以想出以下两件事 10 \ 20 \ 40 \ 50 \ 70 \ 80

当在二元搜索树中搜索键值60时,不必按照给定的顺序遍历包含键值10、20、40、50、70、80、90的节点。这些键值在从根到包含值60的节点的搜索路径上可能出现多少不同的顺序

回答:7/(3!4!)

我不知道他们是怎么想出答案的

我可以想出以下两件事

10
  \
   20
     \
      40
        \
         50
           \
            70
              \
               80
                 \
                  90
                 /
                60

当我尝试其他方法时,我无法通过访问所有给定的值从根跟踪到包含60的节点

e、 g

在上面的例子中,我只能按顺序访问50、90、80、70、60,而忽略了10、20和40。那么,答案是如何得出的呢


也许我不明白这个问题。可能不需要访问所有节点。在这种情况下,如何找到解决方案?

这里有一个小小的思想实验:如果提供了信息,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时,在每一点上,我们需要从第一组中选择最小的值,或者从第二组中选择最大的值作为我们在树搜索中看到的下一个值。因此,我们可以将60的搜索想象为一个由Ls和Rs组成的字符串,其中R表示“从左侧组中选取最小值”,L表示“从右侧组中选取最大值”。例如,rrlll将为我们提供以下搜索路径:

                10
                  \ R
                   20
                     \ R
                      40
                        \ R
                        50
                          \ R
                           90
                          / L
                         80
                        / L
                      70
                     / L
                    60
序列RLR会给我们

                     10
                       \ R
                       90
                       / L
                      20
                       \ R
                       80
                       / L
                      40
                       \ R
                       70
                       / L
                      50
                       \ R
                        60
因此,我们的总体问题的答案是:有多少种方法可以生成一个由4个R和3个L组成的字符串?答案是7选择4(也等于7选择3):我们的字符串中有七个位置,我们可以选择其中四个为R,其余为L,或者选择其中三个为L,其余为R。这就是7!/(4!3!),这与您看到的答案相符

                10
                  \ R
                   20
                     \ R
                      40
                        \ R
                        50
                          \ R
                           90
                          / L
                         80
                        / L
                      70
                     / L
                    60
                     10
                       \ R
                       90
                       / L
                      20
                       \ R
                       80
                       / L
                      40
                       \ R
                       70
                       / L
                      50
                       \ R
                        60