题目描述
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88
思路:树A和树B比较,如果其中一个是空树,那就不存在是不是A的一部分了,可以直接返回false;
以节点root1开始比较和B是不是相同,再递归比较是不是root1的左子树的一部分,再递归比较是不是右子树的一部分
fun函数进行比较A和B,如果树A为空而树B不为空,说明匹配失败返回false
如果B空了,那说明已经匹配完了,返回true
如果节点值不同,说明不匹配,返回true
如果节点值相同,在比较两棵树的左子和右子是不是相同。
注意区别:HasSubtree函数是判断是不是一部分
fun函数时判断是不是相同的两棵树
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
// 思路:先找到树A和B相同的结点,在判断以树A中r结点为根的子树是不是包含B
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2){
// 有一个树是空数都不是子树
if(root1==null || root2==null)
return false;
// 比较看是不是相同的
boolean flag1=fun(root1,root2);
// 递归看是不是左子树的一部分
boolean flag2=HasSubtree(root1.left,root2);
// 递归看是不是右子树的一部分
boolean flag3=HasSubtree(root1.right,root2);
return flag1||flag2||flag3;
}
boolean fun(TreeNode root1,TreeNode root2){
if(root1==null && root2!=null) return false;
if(root2==null) return true;// 说明小树已经匹配完了,要放在val比较的前面,否则会报错
if(root1.val!=root2.val) return false;
// 递归匹配左子和右子
return fun(root1.right,root2.right) &&fun(root1.left,root2.left);
}
}