题目分析
-
一般做法,对二叉树进行遍历,比如先序遍历,如果找到一样的根节点,那么就去找它的左子树和右子树是否相同
-
这里使用了二叉树的序列化,利用字符串进行解决
其实使用了contains
为什么要把空结点也表示?不表示空节点会导致有无数个二叉树
附:前序遍历踩坑
(12!#!#!) contains (2!#!#!)
只要再加上特殊前缀就ok
Solution
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null || t == null) return false;
return postSerialize(s).contains(postSerialize(t));
}
private String postSerialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
postSerialize(root, sb);
return sb.toString();
}
private void postSerialize(TreeNode node, StringBuilder sb) {
sb.append(node.val).append("!");
if (node.left == null) {
sb.append("#!");
} else {
postSerialize(node.left, sb);
}
if (node.right == null) {
sb.append("#!");
} else {
postSerialize(node.right, sb);
}
}
Reference:小码哥MJ