But*_*ass 9 algorithm binary-tree tree-traversal
我正在看一本面试书,问题是:
您有两个非常大的二叉树:
T1
具有数百万个节点,并且T2
具有数百个节点.创建一个算法来确定是否T2
是子树T1
.
作者提到这是一个可能的解决方案:
请注意,此处的问题指定
T1
有数百万个节点 - 这意味着我们应该注意我们使用了多少空间.例如,假设T1
有1000万个节点 - 这意味着仅有数据40 mb
.我们可以创建一个表示inorder和preorder遍历的字符串.如果T2
preorder遍历是's preorder遍历的子字符串T1
,并且T2
inorder遍历是遍历遍历的子字符串T1
,那么它T2
是一个子字符串T1
.
我不太清楚为什么如果这些是真的背后的逻辑:
T2-preorder-traversal-string
是一个子串 T1-preorder-traversal-string
T2-inorder-traversal-string
是一个子串 T1-inorder-traversal-string
那T2
必须是子串(虽然我假设作者的意思是子树)T1
.我能解释一下这个逻辑吗?
编辑:用户BartoszMarcinkowski提出了一个好点.假设两个树都没有重复的节点.
这是该方法的反例。
考虑树T1
:
B
/ \
A D
/ \
C E
\
F
Run Code Online (Sandbox Code Playgroud)
和子树T2
:
D
/ \
C E
Run Code Online (Sandbox Code Playgroud)
相关的遍历是:
T1
预购:BADCEF
T2
预购:DCE
T1
为了:ABCDEF
T2
为了:CDE
虽然DCE
is inBADCEF
和CDE
is in ABCDEF
,T2
实际上不是 的子树T1
。作者对子树的定义一定是不同的,或者只是一个错误。
相关问题:使用前序和中序字符串确定一棵二叉树是否是另一棵二叉树的子树