按顺序:S A E U Y Q R P D F K L M
预购:F A S Q Y E U P R D K L M
我对如何处理中间部分非常困惑。没有组合似乎有用,有帮助吗?有人有伎俩吗?我该如何处理?我已经在这上面打了两个小时。
我必须恢复树。
答案 0 :(得分:2)
正确的结果是
我会尽力为您提供一般性解释,而不是具体的解释。我认为它更有用,毕竟你可以用你的具体案例测试算法,看看算法是否有效并且理解得更好。
您可以以递归的方式思考问题。
为了解决问题,我们可以就一些变量达成一致
preorder
:包含前序遍历的数组inorder
:包含inorder遍历的数组l_p
:preorder
数组r_p
:preorder
数组l_i
:inorder
数组r_i
:inorder
数组在您的具体示例中,第一个实例是l_p = l_i = 0
和r_p = r_i = 12
。
这有助于解释:
index 0 1 2 3 4 5 6 7 8 9 10 11 12
preorder: F A S Q Y E U P R D K L M
inorder: S A E U Y Q R P D F K L M
< left > ^ < right >
|
this is the root
一个非常重要的事实是要意识到当前树的根始终是preorder[l_p]
,这是第一次F
。现在,您必须识别树的左右分支,这些分支在inorder
数组中清楚地区分(参见上图)。为了解这一点,您在inorder
数组中搜索包含根F
的索引;该指数为9
。我们可以看到根位于l_i
之后的九个位置。让i
一个变量来说明与l_i
相关的位置是树的根。
因此,左侧树的键位于inorder
和0
之间的8
数组中,右侧树的键位于10
和{{1}之间}。
为了递归构建左侧树,您有12
,因为您已经看到了根,l_p = l_p + 1
,但数组r_ p = l_p + i =
由inorder
分隔和l_i = 0
。
同样,正确的树位于r_i = l_i + i - 1 =8
和preorder
之间l_p = l_p + i + 1 = 10
,而数组r_p = r_p = 12
则位于inorder
和{之间{1}}。
有了这一切(有点复杂),我们可以勾画出一个算法:
l_i = l_i + i + 1