剑指offer---17--****-(递归)树的子结构
题意
分析
方法一
分为两步走:另外写一个函数,这个函数用在当根节点的参数值相同的情况下,判断第一个树是否包含了第二个树
1.判断当前点是否相同,如果相同就去比较左右子树是否相同
2.如果当前节点不相同,那么就去比较左子树是否包含第二棵树。
代码
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)return false;
boolean result = false;
//如果根节点相等,比较是否是包含关系
if(root1.val == root2.val){
result = doesTree1HaveTree2(root1,root2);
}
//然后判断如果根节点参数值不相等
if(result==false){
result = HasSubtree(root1.left,root2);
}
if(result == false){
result = HasSubtree(root1.right,root2);
}
return result;
}
//这个函数表示当根节点相同的情况下,左右子树是否匹配。
public boolean doesTree1HaveTree2(TreeNode root1,TreeNode root2){
if(root2 == null)return true;//已经匹配完了,就是第二棵树已经结束了
if(root1 == null)return false;//还没有匹配完
if(root1.val != root2.val)return false;
return doesTree1HaveTree2(root1.left,root2.left)&&doesTree1HaveTree2(root1.right,root2.right);
}
}