面试题26:树的子结构

/*

 * 面试题26:树的子结构

 * 题目:输入两棵二叉树AB,判断B是不是A的子结构

 * 思路:要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:

 * 第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。

 * 通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。

 */

class TreeNode2 {

    double val = 0;

    TreeNode2 left = null;

    TreeNode2 right = null;

    public TreeNode2(int val) {

       this.val = val;

    }

}

public class HasSubtree {

 

    public static void main(String[] args) {

       TreeNode2 root1 = new TreeNode2(8);

       TreeNode2 node8 = new TreeNode2(8);

       TreeNode2 node7 = new TreeNode2(7);

 

        root1.left = node8;

        root1.right = node7;

 

        TreeNode2 node9 = new TreeNode2(9);

        node8.left = node9;

 

        TreeNode2 node2 = new TreeNode2(2);

        node8.right = node2;

 

        TreeNode2 node4 = new TreeNode2(4);

        TreeNode2 node72 = new TreeNode2(7);

        node2.left = node4;

        node2.right = node72;

        TreeNode2 root2 = new TreeNode2(8);

        TreeNode2 node92 = new TreeNode2(9);

        TreeNode2 node22 = new TreeNode2(2);

        root2.left = node92;

        root2.right = node22;

        System.out.println(HasSubtree(root1, root2));

    }

 

    public static boolean HasSubtree(TreeNode2 root1, TreeNode2 root2) {

       boolean result = false;

 

       if (root1 != null && root2 != null) {

           //第一步在树A中查找与根节点的值一样的节点,即树的遍历,采用递归调用HasSubtree遍历二叉树A

           //如果没发现这个值相同的节点,则调用doesTree1HaveTree2,进行第二步判断

           if (!result) {

              result = HasSubtree(root1.left,root2);

           }

           if (!result) {

              result = HasSubtree(root1.right,root2);

           }

           //第二步是判断树A中以R为根节点的子树是不是和树B具有相同的结构。

           if (eEqual(root1.val, root2.val)) {

              result = doesTree1HaveTree2(root1, root2);

           }

       }

       return result;

    }

 

    private static boolean doesTree1HaveTree2(TreeNode2 root1, TreeNode2 root2) {

       if (root2 == null) {

           return true;

       }

       if (root1 == null) {

           return false;

       }

       //如果RB值不相同,则肯定没有相同结构

       if(!eEqual(root1.val,root2.val)) {

           return false;

       }

       //如果相同,则递归的判断他们各自的左右节点的值是否相同

       return doesTree1HaveTree2(root1.left,root2.left) && doesTree1HaveTree2(root1.right,root2.right);

    }

    //本题中节点值的类型为double。需要自己定义Equal

    private static boolean eEqual(double val1, double val2) {

       if ((val1 - val2 > -0.0000001) && (val1 - val2 < 0.0000001))

           return true;

       else

           return false;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值