剑指offer 面试题26树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:数还有子树,那肯定是用递归写比较方便了。题目要做的是从A 中找B ,所以需要遍历一遍A树并且寻找A中与B的头节点相等的那个节点,找到这个节点后就遍历A树和B树,看是否相等。第二个方法的递归结束条件分为三种:一:B是空的了,即意味着所有父节点都相等,所以可以返回true。二:A是空的,即不满足AB相等所以返回false。因为A是null不能与B比较。三:AB不相等直接返回false;
第二个方法递归是要将左右子树一起递归,它们返回的boolean值做逻辑与才是结果。
public class 树的子结构 {
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 = Hastree(root1,root2);
}
if(!result){
result =HasSubtree(root1.left,root2);
}
if(!result){
result = HasSubtree(root1.right,root2);
}
return result;
}
public boolean Hastree(TreeNode root1, TreeNode root2){
if(root2==null) return true;
if(root1==null) return false;
if(root1.val!=root2.val) return false;
boolean result = Hastree(root1.left,root2.left)&&Hastree(root1.right,root2.right);
return result;
}
}
}