Java 实现判断一棵树是否是另一颗树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构

约定空树不是任意一个树的子结构

代码

static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

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

    /**
     * 树root2是否是树root1的字结构
     *
     * @param root1
     * @param root2
     * @return
     */
    public static boolean hasSub(TreeNode root1, TreeNode root2) {
        boolean result = false;
        // 首先两棵树不能为null,否则必然不存在子结构一说
        if (root1 != null && root2 != null) {
            // 1. 首先找出相等的根节点
            if (root1.val == root2.val) {
                //2. 然后判断其结构是否相等
                result = isSub(root1, root2);
            }
            // 根节点不相等,就从root1的左子树继续找是否存在与root2根节点相等的节点
            if (!result) {
                result = hasSub(root1.left, root2);
            }
            // 根节点不相等,root1的左子树也没有找到相等的节点,就从其右子树继续找是否存在与root2根节点相等的节点
            if (!result) {
                result = hasSub(root1.right, root2);
            }
        }
        return result;
    }

    /**
     * 树tree2是否与tree1的子结构
     * @param tree1
     * @param tree2
     * @return
     */
    public static boolean isSub(TreeNode tree1, TreeNode tree2) {
        // 如果tree2为null了,说明是其子结构,因为tree2整个树都已经和tree1的某颗子树进行了完整比较,且都相同
        if (tree2 == null) {
            return true;
        }
        // 如果tree1此时为null,而tree2不为null,说明不是其子结构
        // 因为tree1已经没有可用于判断的节点,而tree2还有为比较的节点
        if (tree1 == null) {
            return false;
        }
        // 此时tree1和tree2两颗树相同节点的值不相同,说明tree2不是tree1的子结构
        if (tree1.val != tree2.val) {
            return false;
        }
        // 继续判断当前节点的左子树和右子树是否相等
        return isSub(tree1.left, tree2.left) && isSub(tree1.right, tree2.right);
    }

    public static void main(String[] args) {
        TreeNode root1 = buildTree1();
        TreeNode root2 = buildTree2();
        boolean result = hasSub(root1, root2);
        // true
        System.out.println(result);
        root2 = buildTree3();
        result = hasSub(root1, root2);
        // false
        System.out.println(result);
    }

    /**
     * 创建tree1:</br>
     *          5</br>
     *      3       18</br>
     * @return
     */
    private static TreeNode buildTree1(){
        TreeNode root = new TreeNode(5);
        TreeNode left = new TreeNode(3);
        TreeNode right = new TreeNode(18);
        root.left = left;
        root.right = right;
        return root;
    }

    /**
     * 创建tree2:</br>
     *          5</br>
     *      3</br>
     * @return
     */
    private static TreeNode buildTree2(){
        TreeNode root = new TreeNode(5);
        TreeNode left = new TreeNode(3);
        root.left = left;
        return root;
    }

    /**
     * 创建tree3:</br>
     *          4</br>
     * @return
     */
    private static TreeNode buildTree3(){
        TreeNode root = new TreeNode(4);
        return root;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值