I\'m looking at an interview book and the question is:
You have two very large binary trees:
T1
, with millions of nodes, andT2
I think it is not true. Consider:
T2:
2
/ \
1 3
inorder 123 preorder 213
and
T1:
0
/ \
3 3
/ \
1 1
/ \
0 2
inorder 0123103 preorder 0310213
123
is substring of 0123103
, 213
is substring of 0310213
, but T2 is not subtree of T1.
Here is a counter-example to the method.
Consider the tree T1
:
B
/ \
A D
/ \
C E
\
F
And the sub-tree T2
:
D
/ \
C E
The relevant traversals are:
T1
pre-order: BADCEF
T2
pre-order: DCE
T1
in-order: ABCDEF
T2
in-order: CDE
While DCE
is in BADCEF
and CDE
is in ABCDEF
, T2
is not actually a sub-tree of T1
. The author's definition of sub-tree must have been different or it was just a mistake.
Related question: Determine if a binary tree is subtree of another binary tree using pre-order and in-order strings
Important assumption is that the tree has unique keys.
Now, note that preorder-traversal-string
and inorder-traversal-string
uniquely identify a binary tree.
Scatch of the proof:
Let T
be a tree.
preorder-traversal-string(T)
is the root.inorder-traversal-string(T)
- everything on left of that element is your left subtree L
, let's call this substring inorder-traversal-string(L)
. Everything on right is your right subtree R
.Now, let's focus on the left subtree L
.
preorder-traversal-string(L)
ends in preorder-traversal-string(T)
.inorder-traversal-string(L)
and preorder-traversal-string(L)
have the same length. This gives as the place where to cut.inorder-traversal-string(L)
and preorder-traversal-string(L)
so you can repeat the procedure till the end.Following those steps (inefficient but it is just for the proof) for all subtrees you will uniquely build the tree.
Thus, all subtrees of T1
are described uniquely by corresponding inorder-traversal-string
and preorder-traversal-string
.