剑指 Offer 26. 树的子结构

class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) {
return false;
}
if (isSameStructure(A, B)) {
return true;
}
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
public boolean isSameStructure(TreeNode p, TreeNode q) {
if(q == null) {
return true;
}
if(p == null) {
return false;
}
return p.val == q.val && isSameStructure(p.left, q.left) && isSameStructure(p.right, q.right);
}
}
572. 另一棵树的子树

class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (root == null) {
return subRoot == null;
}
if (isSameTree(root, subRoot)) {
return true;
}
return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
652. 寻找重复的子树

class Solution {
HashMap<String, Integer> memo = new HashMap<>();
LinkedList<TreeNode> res = new LinkedList<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
traverse(root);
return res;
}
String traverse(TreeNode root) {
if(root == null) {
return "#";
}
String left = traverse(root.left);
String right = traverse(root.right);
String subTree = left + "," + right + "," + root.val;
int count = memo.getOrDefault(subTree, 0);
if(count == 1) {
res.add(root);
}
memo.put(subTree, count + 1);
return subTree;
}
}