题目
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
思路
需要找到所有在 root 中 val 值与 subRoot 相等的子树,因为会有重复的值所以需要通过一个集合收集起来,
遍历集合判断叔的结构和值如果有一个满足条件就返回 true
代码
public class Solution {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
List<TreeNode> nodeList = new ArrayList<>();
findRoot(root, subRoot, nodeList);
if (nodeList.isEmpty()) {
return false;
}
for (TreeNode treeNode : nodeList) {
boolean dfs = dfs(treeNode, subRoot);
if (dfs) {
return true;
}
}
return false;
}
private void findRoot(TreeNode root, TreeNode subRoot, List<TreeNode> list) {
if (root == null) {
return;
}
if (root.val == subRoot.val) {
list.add(root);
}
findRoot(root.left, subRoot, list);
findRoot(root.right, subRoot, list);
}
private boolean dfs(TreeNode root, TreeNode subRoot) {
if (root.val != subRoot.val) {
return false;
}
TreeNode rootLeft = root.left;
TreeNode subRootLeft = subRoot.left;
if (rootLeft == null && subRootLeft != null || rootLeft != null && subRootLeft == null) {
return false;
}
TreeNode rootRight = root.right;
TreeNode subRootRight = subRoot.right;
if (rootRight == null && subRootRight != null || rootRight != null && subRootRight == null) {
return false;
}
boolean rightRes =true;
if (rootRight != null) {
rightRes = dfs(rootRight, subRootRight);
}
boolean leftRes = true;
if (rootLeft != null) {
leftRes = dfs(rootLeft, subRootLeft);
}
return rightRes && leftRes;
}
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;
}
}
}