题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路很明确,就是循环遍历一个树的节点到另一个树上去找;只不过这里的循环是用递归来处理的。
但是怎么找呢?首先看一个节点是否相等,相等后开始遍历该节点后的左右子树,如果相等,那么就找到了。这是个递归1。
当子节点不等,那么就要从新换原树的节点了。递归2
拿到一个题目,我们要考虑到边界是否考虑清楚。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
//先找一个节点是否相等,若等,递归后续节点(递归2);不等,移到左子树(递归1)
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
//边界判断
//2.两个树是否为null
if(root2==null||root1==null){
return false;
}
//1.根是否相等
if(root1==root2){
return true;
}
boolean result=false;
if(root1.val==root2.val){
//递归2 调用子树
result=Match(root1,root2);
}
if(result){
return true;
}
//到这里,说明子树不匹配,到原树左右树去找(递归1)
return HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
public boolean Match(TreeNode root1,TreeNode root2) {
if(root1==root2){
return true;
}
// 只要树B的根结点点为空就返回true
if (root2 == null) {
return true;
}
// 树B的根结点不为空,如果树A的根结点为空就返回false
if (root1 == null) {
return false;
}
if(root1.val==root2.val){
return Match(root1.left,root2.left)&&Match(root1.right,root2.right);
}
return false;
}
}