- 二叉树拼图 - 从这些遍历中绘制树:

时间:2015-10-31 01:18:08

标签: tree binary-tree inorder preorder

按顺序: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

This is what I came up with until now.

我对如何处理中间部分非常困惑。没有组合似乎有用,有帮助吗?有人有伎俩吗?我该如何处理?我已经在这上面打了两个小时。

我必须恢复树。

1 个答案:

答案 0 :(得分:2)

正确的结果是

your concrete result

我会尽力为您提供一般性解释,而不是具体的解释。我认为它更有用,毕竟你可以用你的具体案例测试算法,看看算法是否有效并且理解得更好。

您可以以递归的方式思考问题。

为了解决问题,我们可以就一些变量达成一致

  • preorder:包含前序遍历的数组
  • inorder:包含inorder遍历的数组
  • l_ppreorder数组
  • 中的左侧索引
  • r_ppreorder数组
  • 中的右侧索引
  • l_iinorder数组
  • 中的左侧索引
  • r_iinorder数组
  • 中的右侧索引

在您的具体示例中,第一个实例是l_p = l_i = 0r_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相关的位置是树的根。

因此,左侧树的键位于inorder0之间的8数组中,右侧树的键位于10和{{1}之间}。

为了递归构建左侧树,您有12,因为您已经看到了根,l_p = l_p + 1,但数组r_ p = l_p + i =inorder分隔和l_i = 0

同样,正确的树位于r_i = l_i + i - 1 =8preorder之间l_p = l_p + i + 1 = 10,而数组r_p = r_p = 12则位于inorder和{之间{1}}。

有了这一切(有点复杂),我们可以勾画出一个算法:

l_i = l_i + i + 1