572. 另一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力搜索
class Solution {
private boolean solve(TreeNode root, TreeNode subRoot) {
if (root == null) {
return false;
}
return check(root, subRoot) || solve(root.left, subRoot) || solve(root.right, subRoot);
}
private boolean check(TreeNode root, TreeNode subRoot) {
if (root == null && subRoot == null) {
return true;
}
if (root == null || subRoot == null) {
return false;
}
return root.val == subRoot.val && check(root.left, subRoot.left) && check(root.right, subRoot.right);
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
return solve(root, subRoot);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
KMP
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
class Solution {
private void getOrder(TreeNode root, List<Integer> orders) {
if (root == null) {
orders.add(null);
return;
}
orders.add(root.val);
getOrder(root.left, orders);
getOrder(root.right, orders);
}
private int[] getNext(List<Integer> list) {
int[] next = new int[list.size()];
next[0] = -1;
int i = 0, j = -1;
while (i < list.size() - 1) {
if (j == -1 || Objects.equals(list.get(i), list.get(j))) {
++i;
++j;
if (Objects.equals(list.get(i), list.get(j))) {
next[i] = next[j];
} else {
next[i] = j;
}
} else {
j = next[j];
}
}
return next;
}
private boolean match(List<Integer> l1, List<Integer> l2) {
int[] next = getNext(l2);
int i = 0, j = 0;
while (i < l1.size() && j < l2.size()) {
if (j == -1 || Objects.equals(l1.get(i), l2.get(j))) {
++i;
++j;
} else {
j = next[j];
}
}
return j == l2.size();
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
List<Integer> l1 = new ArrayList<>();
getOrder(root, l1);
List<Integer> l2 = new ArrayList<>();
getOrder(subRoot, l2);
return match(l1, l2);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
心之所向,素履以往 生如逆旅,一苇以航