剑指Offer-树的子结构

树的子结构

题目

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路先找同一个根节点,然后进行匹配ß  两次递归

思路

首先找到相同的根节点,然后递归是否相同

代码

public class HasSubTree {
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }

        public boolean HasSubtree(TreeNode root1, TreeNode root2) {
            if (root1 == null || root2 == null) {
                return false;
            }
            boolean result = false;
            if (root1 != null && root2 != null) {
                if (root1.val == root2.val) {
                    result = DoesTree1HaveTree2(root1, root2);
                }
                if (!result) result = HasSubtree(root1.left, root2);
                if (!result) result = HasSubtree(root1.right, root2);
            }
            return result;
        }

    }

    private boolean DoesTree1HaveTree2(TreeNode roo1, TreeNode root2) {
        if (roo1 == null && root2 != null) return false;
        if (root2 == null) return true;
        if (roo1.val != root2.val) {
            return false;
        }

        return DoesTree1HaveTree2(roo1.left, root2.left) && DoesTree1HaveTree2(root2.right, root2.right);
    }
    /**
     * 输入两棵二叉树A和B,判断B是不是A的子结构。
     * 该方法是在A树中找到一个与B树的根节点相等的元素的结点,
     * 从这个相等的结点开始判断树B是不是树A的子结构,如果找到其的一个就返回,
     * 否则直到所有的结点都找完为止。
     *
     * @param root1 树A的根结点
     * @param root2 树B的根结点
     * @return true:树B是树A的子结构,false:树B是不树A的子结构
     */
    public boolean HasSubtree_II(TreeNode root1,TreeNode root2){
        if (root1==root2){
            return true;
        }

        if (root2==null){
            return true;
        }

        if (root1==null){
            return false;
        }

        boolean result = false;

        if (root1.val==root2.val){
            result = match(root1,root2);
        }

        if (result){
            return true;
        }

        return HasSubtree_II(root1.left,root2)||HasSubtree_II(root1.right,root2);
    }
    /**
     * 从树A根结点root1和树B根结点root2开始,一个一个元素进行判断,判断B是不是A的子结构
     *
     * @param root1 树A开始匹配的根结点
     * @param root2 树B开始匹配的根结点
     * @return 树B是树A的子结构,false:树B是不树A的子结构
     */
    private boolean match(TreeNode root1, TreeNode root2) {

        if (root1==root2){
            return true;
        }

        if (root2==null){
            return true;
        }

        if (root1==null){
            return false;
        }

        if (root1.val==root2.val){
            return match(root1.left,root2.left)&&match(root1.right,root2.right);
        }

        return false;
    }
}
0%