剑指offer17-树的子结构

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路:

1.先判断root1的根节点和root2的根节点是否相同

2.若是不相同,则递归遍历root1的左右子树,直到找到一个节点与root2的根节点相同

3.若是相同,则依次遍历左右节点,查看root1是否包含root2(注意,对应的点root2存在,root1必存在且值与root2相等,root2不存在,root1可以存在也可以不存在)

/**
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) {
         //先找pRoot1中是否含有pRoot2的根节点
        boolean flag = false;
        if(root1!=null&&root2!=null)
        {
            if(root1.val == root2.val)
                flag = IsSame(root1,root2);
            if(!flag)
                flag = HasSubtree(root1.left,root2);
            if(!flag)
                flag = HasSubtree(root1.right,root2);
        }
        return flag;

    }
    public boolean IsSame(TreeNode root1, TreeNode root2)
    {
        //判断以pRoot1为根节点的树是否包含以pRoot2为根节点的树
        if(root2==null) //root2可以为空
            return true;
        if(root1==null && root2!=null)
            return false;
        if(root1.val == root2.val)
        {
            return IsSame(root1.left, root2.left)&&IsSame(root1.right, root2.right);
        }
        return false;
            
    }
   
    
}
原文地址:https://www.cnblogs.com/loyolh/p/12347060.html