题目
我的想法是找到A树每一个与B树跟结点相同的结点 放入List中
遍历list中的结点当做起点去判断 是否B树是A树的子结构
class Solution {
ArrayList<TreeNode> list = new ArrayList<>();
public void find(TreeNode a,TreeNode b){
if (a == null) return;
if (a.val == b.val) list.add(a);
find(a.left,b);
find(a.right,b);
}
public boolean isSub(TreeNode A,TreeNode B){
if (B == null) return true;//B树遍历到null时说明是子树
if (A == null) return false;//A树为nullB树不为null说明结构不同
//值相等并且左右子树都相等
return ((A.val == B.val) && isSub(A.left,B.left) && isSub(A.right,B.right));
}
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) return false;
boolean flag = false;
find(A,B);
for (TreeNode root : list) {
if (solution(root,B)){
flag = true;
break;
}
}
return flag;
}
}
和题解学的简洁写法 真的妙啊 时间复杂不知道为什么更快 玄学
public boolean isSub(TreeNode A,TreeNode B){
if (B == null) return true;//B树遍历到null时说明是子树
if (A == null) return false;//A树为nullB树不为null说明结构不同
//值相等并且左右子树都相等
return ((A.val == B.val) && isSub(A.left,B.left) && isSub(A.right,B.right));
}
public boolean isSubStructure(TreeNode A, TreeNode B) {
if (A == null || B == null) return false;
//当前结点是否为B树的起点 或者左儿子和右儿子
return (isSub(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right ,B));
}