剑指Offer-二叉树-(2)

知识点/数据结构:二叉树

题目描述:
输入两棵二叉树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;
            }
        }
}

猜你喜欢

转载自blog.csdn.net/qq_35649064/article/details/84817229