-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathSubtreeOfAnotherTree572.java
More file actions
115 lines (102 loc) · 3.08 KB
/
SubtreeOfAnotherTree572.java
File metadata and controls
115 lines (102 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* Given two non-empty binary trees s and t, check whether tree t has exactly
* the same structure and node values with a subtree of s. A subtree of s is a
* tree consists of a node in s and all of this node's descendants. The tree s
* could also be considered as a subtree of itself.
*
* Example 1:
* Given tree s:
*
* 3
* / \
* 4 5
* / \
* 1 2
* Given tree t:
* 4
* / \
* 1 2
* Return true, because t has the same structure and node values with a subtree of s.
*
* Example 2:
* Given tree s:
*
* 3
* / \
* 4 5
* / \
* 1 2
* /
* 0
* Given tree t:
* 4
* / \
* 1 2
* Return false.
*
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class SubtreeOfAnotherTree572 {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null) return false;
if (isSame(s, t)) return true;
return isSubtree(s.left, t) || isSubtree(s.right, t);
}
public boolean isSame(TreeNode s, TreeNode t) {
if (s == null) return t == null;
if (t == null) return s == null;
if (s.val != t.val) return false;
return isSame(s.left, t.left) && isSame(s.right, t.right);
}
/**
* https://leetcode.com/problems/subtree-of-another-tree/discuss/102760/Easy-O(n)-java-solution-using-preorder-traversal
*/
public boolean isSubtree2(TreeNode s, TreeNode t) {
String spreorder = generatepreorderString(s);
String tpreorder = generatepreorderString(t);
return spreorder.contains(tpreorder) ;
}
public String generatepreorderString(TreeNode s){
StringBuilder sb = new StringBuilder();
Stack<TreeNode> stacktree = new Stack();
stacktree.push(s);
while(!stacktree.isEmpty()){
TreeNode popelem = stacktree.pop();
if(popelem==null)
sb.append(",#"); // Appending # inorder to handle same values but not subtree cases
else
sb.append(","+popelem.val);
if(popelem!=null){
stacktree.push(popelem.right);
stacktree.push(popelem.left);
}
}
return sb.toString();
}
/**
* https://leetcode.com/problems/subtree-of-another-tree/discuss/102736/Java-Concise-O(n+m)-Time-O(n+m)-Space
*/
public boolean isSubtree3(TreeNode s, TreeNode t) {
return serialize(s).contains(serialize(t)); // Java uses a naive contains algorithm so to ensure linear time,
// replace with KMP algorithm
}
public String serialize(TreeNode root) {
StringBuilder res = new StringBuilder();
serialize(root, res);
return res.toString();
}
private void serialize(TreeNode cur, StringBuilder res) {
if (cur == null) {res.append(",#"); return;}
res.append("," + cur.val);
serialize(cur.left, res);
serialize(cur.right, res);
}
}