知识点/数据结构:二叉树
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:
第一步:在树A中找到和树B的根节点一样的值一样的节点R;
实际上就是树的遍历,可以用递归的方法去遍历,也可以用循环的方法去遍历;
第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构;
也可以用递归的思路来看考虑:如果节点R的值和树B的根节点不相同,停止;如果他们的值相同,则递归判断他们各自的左右节点的值是不是相同。
递归终止条件:我们达到了树A或者树B的叶节点。
/**
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 tree1,TreeNode tree2){
boolean result = false;
if((tree1!=null)&&(tree2!=null)){
if(tree1.val==tree2.val){
result = DoesTree1HasTree2(tree1,tree2);
}
//执行下面的代码代表第一个根节点不一样,开始比较左子树,和右子树。
//如果result没有改变,说明沿着主树找不到,才开始找左右子树
if(!result){
result = HasSubtree(tree1.left,tree2);
}
//左右子树是并列的,而不是相容的,就是两个之中有一个就好
if(!result){
result = HasSubtree(tree1.right,tree2);
}
}
return result;
}
public boolean DoesTree1HasTree2(TreeNode root1,TreeNode root2){
if(root1==null&&root2!=null){
return false;
//下面的else if没搞懂,因为题目说:我们约定空树不是任意一个树的子结构
//搞懂了:因为上面开始判断的时候是树A和树B都不为空的时候,这个判断是在判断过程中。
//表示的意思就是左边的树包括了右边,类似集合B属于A<A中的元素个数大于B中的元素个数>
}else if(root2==null){
return true;
}else if(root1.val==root2.val){
return DoesTree1HasTree2(root1.left,root2.left)&&DoesTree1HasTree2(root1.right,root2.right);
}else{
return false;
}
}
}
注意点:在第一层循环中,递归调用的自己,而在下面的函数定义中,也是调用的自己本身