由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请高手指教:CC150 Subtree 问题(4.7)的一点疑问
相关主题
问一道算法题问几个有关Binary tree的题
一个电面疑问reconstruct the tree from inorder and postorder lists
BST 找重复节点数问个1337网页上面的经典题
CC150最大的好处攒人品,amazon一面经历
考大家个新题 visitor reconstruct generic treepreorder/postorder和inorder重建树有非递归的方法吗?
F家phone interview的一道题问一道二叉树遍历的问题? 谢谢!
Create Binary Tree from preorder and inorder arrays现在怎么都是讨论offer的,没有做题的了?
报google nyc offer,并分享面经[leetcode] Binary Tree from Inorder & Postorder Traversal
相关话题的讨论汇总
话题: inorder话题: preorder话题: postorder话题: t2话题: t1
进入JobHunting版参与讨论
1 (共1页)
c**y
发帖数: 172
1
问题简单概述:Binary Tree T1(大)和T2(小),判断T2是不是T1的substree。
CC150给的解法是对于每一个Tree,用InOrder和PreOrder的方法生成两个序列,然后判
断T2的两个序列是不是T1两个序列的substring。CC150还有brutal force的解法(这里
就不讨论了)。
我的问题是
1.这个序列比较的解法要求T1和T2不能有duplicate元素?这个应该是确定的,参见
http://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-
2.为什么不比较PostOrder生成的序列呢?下面是一个反例(如果只用PreOrder和
InOrder
,返回True,但是实际应该是False)
T1:
1
/ \
2 3
\
4
T2:
1
/ \
2 3
T1:
InOrder: 2134
PreOrder: 1234
T2:
InOrder: 213
PreOrder: 123
如果只用InOrder和PreOrder,T2是T1的subtree。但是如果考虑PostOrder的话,就不
是了。
T1
PostOrder:2431
T2
PostOrder:231
l*******b
发帖数: 2586
2
记得这题大家说有点bug
brutal force好像复杂度很高吧
c**y
发帖数: 172
3
brutal force复杂度是比较高,但是如果有duplicate的话,只能用brutal force吧。
我只是不理解为什么CC150和我贴的论坛上说只用InOrder和PreOrder就可以了。上面那
个反例说明只用InOrder和PreOrder不够的。另外一个问题是InOrder,PreOrder和
PostOrder是不是就可以了呢(对于没有duplicate的元素)?
e****e
发帖数: 418
4
我觉得你的反例已经说明只用InOrder和PreOrder是不行的。我也给出一个反例说明即
使有PostOrder还是不行。
T1:
1
/
2
T2:
1

【在 c**y 的大作中提到】
: brutal force复杂度是比较高,但是如果有duplicate的话,只能用brutal force吧。
: 我只是不理解为什么CC150和我贴的论坛上说只用InOrder和PreOrder就可以了。上面那
: 个反例说明只用InOrder和PreOrder不够的。另外一个问题是InOrder,PreOrder和
: PostOrder是不是就可以了呢(对于没有duplicate的元素)?

B********t
发帖数: 147
5
是你自己弄错了吧。。
用preorder inorder的方法,T2就不是T1的subtree. preorder inorder的这种方法是
需要在node之间加一些special character的,以便知道哪些左 右子树为NULL.
T1:inorder: 0201034
T2: inorder: 0201030

【在 c**y 的大作中提到】
: 问题简单概述:Binary Tree T1(大)和T2(小),判断T2是不是T1的substree。
: CC150给的解法是对于每一个Tree,用InOrder和PreOrder的方法生成两个序列,然后判
: 断T2的两个序列是不是T1两个序列的substring。CC150还有brutal force的解法(这里
: 就不讨论了)。
: 我的问题是
: 1.这个序列比较的解法要求T1和T2不能有duplicate元素?这个应该是确定的,参见
: http://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-
: 2.为什么不比较PostOrder生成的序列呢?下面是一个反例(如果只用PreOrder和
: InOrder
: ,返回True,但是实际应该是False)

c**y
发帖数: 172
6
多谢楼上指出PreOrder和InOrder算法的关键,我确实忽略了关于特殊字符的使用。这
个论坛上的人已经给出了这样的算法。具体参见Himanshu给的solution
http://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-
我另外有两个问题
1. PostOrder和InOrder+特殊字符的方法是不是同样可行呢?
2. PreOrder,InOrder和PostOrder不加特殊字符的方法可以不可以呢?
c********t
发帖数: 5706
7
1. PostOrder和InOrder+特殊字符的方法是不是同样可行呢?

2. PreOrder,InOrder和PostOrder不加特殊字符的方法可以不可以呢?
不可以,见ls迪迪贴

【在 c**y 的大作中提到】
: 多谢楼上指出PreOrder和InOrder算法的关键,我确实忽略了关于特殊字符的使用。这
: 个论坛上的人已经给出了这样的算法。具体参见Himanshu给的solution
: http://www.geeksforgeeks.org/check-if-a-binary-tree-is-subtree-
: 我另外有两个问题
: 1. PostOrder和InOrder+特殊字符的方法是不是同样可行呢?
: 2. PreOrder,InOrder和PostOrder不加特殊字符的方法可以不可以呢?

c**y
发帖数: 172
8
多谢回复,还是有两个问题不明白,能否详细指教一下。

这个用特殊字符的方法一定要比较Both PreOrder(或者PostOrder)和InOrder的序列
吗?如果是的话,原因是什么呢?
啥是ls迪迪贴呀?另外问题2可能我没有表述清楚。我的意思是比较三个序列(分别由
InOrder,PreOrder和PostOrder Traversal的方法生成,但是不加任何特殊字符)。这
样三个序列不能唯一的确定一个Binary Tree吗?

【在 c********t 的大作中提到】
: 1. PostOrder和InOrder+特殊字符的方法是不是同样可行呢?
: 是
: 2. PreOrder,InOrder和PostOrder不加特殊字符的方法可以不可以呢?
: 不可以,见ls迪迪贴

c********t
发帖数: 5706
9
1. 我感觉两两组合都可以 Pre+post也应该可以,看看有没有人能给出反例
2. 楼上迪迪说的例子,就是反例啊
tree 1
1
/
2
tree 2
1

【在 c**y 的大作中提到】
: 多谢回复,还是有两个问题不明白,能否详细指教一下。
:
: 这个用特殊字符的方法一定要比较Both PreOrder(或者PostOrder)和InOrder的序列
: 吗?如果是的话,原因是什么呢?
: 啥是ls迪迪贴呀?另外问题2可能我没有表述清楚。我的意思是比较三个序列(分别由
: InOrder,PreOrder和PostOrder Traversal的方法生成,但是不加任何特殊字符)。这
: 样三个序列不能唯一的确定一个Binary Tree吗?

s*****1
发帖数: 134
10
我也觉得此题很莫名,如果null用特殊符号算的话,单用preorder就行了,我举不出单
用preorder的反例~似乎serialize 和 deserialize 也只用preorder~
c**y
发帖数: 172
11
多谢回复。迪迪的帖子证明了即便inorder,preorder,和postorder都用也是不行的。
关于如果允许使用特殊字符的话,好像只要一个就可以了,either inorder, preorder
或者postorder都可以。通过使用特殊字符,一个binary tree的信息可以被一个序列完
全复制和恢复。因此只要一个序列就可以了。例如
2
/ \
1 3
Inorder: (1)2(3)
Preorder: 21()3()
Postorder: ()1()32
多谢各位
y*******g
发帖数: 6599
12
你所谓的特殊字符是什么?

preorder

【在 c**y 的大作中提到】
: 多谢回复。迪迪的帖子证明了即便inorder,preorder,和postorder都用也是不行的。
: 关于如果允许使用特殊字符的话,好像只要一个就可以了,either inorder, preorder
: 或者postorder都可以。通过使用特殊字符,一个binary tree的信息可以被一个序列完
: 全复制和恢复。因此只要一个序列就可以了。例如
: 2
: / \
: 1 3
: Inorder: (1)2(3)
: Preorder: 21()3()
: Postorder: ()1()32

c**y
发帖数: 172
13
特殊字符就是()
以下是个inorder的例子
printf("(");
inrodervisit(p_node->p_leftchild);
printf(")");
printf(p_node->value);
printf("(");
inrodervisit(p_node->p_rightchild);
printf(")");
这样每次访问一个新的subtree,总是会打印一个()surrounding这个subtree的序列
1 (共1页)
进入JobHunting版参与讨论
相关主题
[leetcode] Binary Tree from Inorder & Postorder Traversal考大家个新题 visitor reconstruct generic tree
LeetCode construct Binary TreeF家phone interview的一道题
Construct Binary Tree from Inorder and Postorder TraversalCreate Binary Tree from preorder and inorder arrays
Amazon 电面报google nyc offer,并分享面经
问一道算法题问几个有关Binary tree的题
一个电面疑问reconstruct the tree from inorder and postorder lists
BST 找重复节点数问个1337网页上面的经典题
CC150最大的好处攒人品,amazon一面经历
相关话题的讨论汇总
话题: inorder话题: preorder话题: postorder话题: t2话题: t1