首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么无序遍历和前置遍历对于创建一个算法来确定T2是否是T1的子树很有用?

为什么无序遍历和前置遍历对于创建一个算法来确定T2是否是T1的子树很有用?
EN

Stack Overflow用户
提问于 2014-01-20 16:14:46
回答 3查看 826关注 0票数 9

我正在看一本采访书,问题是:

您有两个非常大的二叉树:T1 (数百万节点)和T2 (数百个节点)。创建一个算法来确定T2是否是T1的子树。

作者提到这是一种可能的解决办法:

请注意,这里的问题指定T1有数百万个节点--这意味着我们应该小心使用多少空间。例如,假设T1有1000万个节点--这意味着仅数据就是关于40 mb的。我们可以创建一个字符串,表示无序和前置遍历。如果T2的序遍历是T1序遍历的子串,T2的序遍历是T1序遍历的子串,则T2T1的子串。

我不太清楚为什么这些都是真的:

  • T2-preorder-traversal-stringT1-preorder-traversal-string的子字符串
  • T2-inorder-traversal-stringT1-inorder-traversal-string的子字符串

T2必须是T1的子字符串(尽管我假设作者是子树)。我能解释一下这个逻辑吗?

编辑:用户BartoszMarcinkowski提出了一个很好的观点。假设两棵树都没有重复的节点。

EN

回答 3

Stack Overflow用户

发布于 2014-01-20 16:40:10

我认为这不是真的。考虑:

代码语言:javascript
复制
T2:

  2
 / \
1   3

inorder 123 preorder 213

代码语言:javascript
复制
T1:

      0
     / \
    3   3
   / \ 
  1   1
 / \ 
0   2


inorder 0123103 preorder 0310213

1230123103的子字符串,2130310213的子字符串,但T2不是T1的子树。

票数 4
EN

Stack Overflow用户

发布于 2014-01-20 16:35:35

以下是该方法的反例。

以树T1为例

代码语言:javascript
复制
  B
 / \
A   D
   / \
  C   E
       \
        F

和子树T2

代码语言:javascript
复制
  D
 / \
C   E

相关的横断面是:

  • T1预订货:BADCEF
  • T2预订货:DCE
  • T1 order:ABCDEF
  • T2 order:CDE

DCEBADCEF中,CDEABCDEF中,T2实际上不是T1的子树。作者对子树的定义一定是不同的,否则这只是一个错误。

相关问题:Determine if a binary tree is subtree of another binary tree using pre-order and in-order strings

票数 1
EN

Stack Overflow用户

发布于 2014-01-20 16:39:06

重要的假设是树有唯一的键

现在,请注意,preorder-traversal-stringinorder-traversal-string唯一地标识了二叉树。

证明的样条:

T成为一棵树。

  • preorder-traversal-string(T)中的第一个对象是根。
  • inorder-traversal-string(T)中找到它--该元素左侧的所有内容都是您的左子树L,让我们调用这个子字符串inorder-traversal-string(L)。右边的所有东西都是您的右子树R

现在,让我们关注左侧子树L

  • 显然,在两个字符串中,所有子树都是分开的(它们不混合)。它们被表示为连续的对象。唯一的问题是,我们事先不知道preorder-traversal-string(L)preorder-traversal-string(T)中的结尾位置。
  • 注意,字符串inorder-traversal-string(L)preorder-traversal-string(L)具有相同的长度。这里作为切割的地方。
  • 现在您有了一个子树,它被描述为子字符串inorder-traversal-string(L)preorder-traversal-string(L),所以您可以重复这个过程直到结束。

按照这些步骤(效率低下,但这只是为了证明),您将唯一地构建树。

因此,T1的所有子树都由相应的inorder-traversal-stringpreorder-traversal-string唯一描述。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21238899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档