题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路
分为两部分(递归法)
- 遍历A(较大的)树,看是否有与B树根节点的值 相同的结点
两个树有一个为空,返回false
如果找到值相同的点,判断B树是否为A的子结构,若是,返回true
当前结点不等,递归判断左孩子和右孩子,若二者中有一个true,返回true - 判断B树是否为A树子结构
如果此时B树遍历完成,返回true
如果A树遍历完成(此时B还未遍历完),返回false
如果两棵树当前结点相同,判断左孩子和右孩子是否相同,均相同,返回true
否则,返回false
/**
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) {
//两树中有一个为空,返回false
if(root1==null || root2==null)
return false;
//在A树中找到与B树根节点值相同的点,如果找到,判断是否为树的子结构
if(root1.val== root2.val){
//注意!!!
if(travel(root1,root2))
return true;
}
//当前结点不相等,判断A当前结点左孩子和右孩子,是否与B根节点相等
//二者之间有一个为真,返回true,否则返回false
return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
}
//判断A子树是否>=B树,即B是否为A子结构
public static boolean travel(TreeNode r1,TreeNode r2){
//B树遍历完成,证明B为A子结构
if(r2==null)
return true;
//A树遍历完成,此时B树还有结点,证明B不为A子结构
if(r1==null)
return false;
//若两个树当前结点值相同,分别判断左子树,右子树值是否相同
//二者均相同,返回true
if(r1.val==r2.val)
return travel(r1.left,r2.left)&&travel(r1.right,r2.right);
return false;
}
}