面试题 18: 树的子结构

一. 题目
输入两棵二叉树A和B,判断B是不是A的子结构.

代码请到我的代码库中下载 Point2Offer

二. 代码

package week_4;

/**难度系数:***
 * 剑指offer: 树的子结构
 * 方法:递归,第一次判断找到根节点一样的节点,第二步比较左右子树结构是否相同,递归终止条件到达
 * A或B的叶节点
 * 测试用例:功能测试(是子结构/不是子结构/其中一棵树为空/单节点)
 * @author dingding
 * Date:2017-7-3 9:35
 * Declaration: All Rights Reserved!
 */
public class No18 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
    }
    //solution,第一步,找到根节点值相同的节点
    private static boolean hasSubtree(BinaryTreeNode pRoot1,BinaryTreeNode pRoot2){
        boolean result = false;

        if (pRoot1 != null && pRoot2 != null) {
            if (pRoot1.value == pRoot2.value) {
                result = doesTree1HaveTree2(pRoot1,pRoot2);
            }
            if (!result) {
                result = hasSubtree(pRoot1.left, pRoot2);
            }
            if (!result) {
                result = hasSubtree(pRoot1.right, pRoot2);
            }
        }
        return result;
    }

    //比较左右子树的结构是否相同
    private static boolean doesTree1HaveTree2(BinaryTreeNode pRoot1, BinaryTreeNode pRoot2) {
        if (pRoot2 == null) {
            return true;
        }

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

        //内部递归结束条件之一
        if (pRoot1.value != pRoot2.value) {
            return false;
        }

        return doesTree1HaveTree2(pRoot1.left, pRoot2.left) && doesTree1HaveTree2(pRoot1.right, pRoot2.right);
    }
    /*==================测试用例================*/
    //正常子树,B是A的子结构
    private static void test1() {
        BinaryTreeNode root1 = new BinaryTreeNode(8);
        root1.left = new BinaryTreeNode(8);
        root1.right = new BinaryTreeNode(7);
        root1.left.left = new BinaryTreeNode(9);
        root1.left.right = new BinaryTreeNode(2);
        root1.left.right.left = new BinaryTreeNode(4);
        root1.left.right.right = new BinaryTreeNode(7);

        BinaryTreeNode root2 = new BinaryTreeNode(8);
        root2.left = new BinaryTreeNode(9);
        root2.right = new BinaryTreeNode(2);

        boolean result = hasSubtree(root1, root2);
        if (result) {
            System.out.println("Yes.");
        }else {
            System.out.println("No.");
        }
    }

    //B不是A的子结构
    private static void test2() {
        BinaryTreeNode root1 = new BinaryTreeNode(8);
        root1.left = new BinaryTreeNode(8);
        root1.right = new BinaryTreeNode(7);
        root1.left.left = new BinaryTreeNode(9);
        root1.left.right = new BinaryTreeNode(2);
        root1.left.right.left = new BinaryTreeNode(4);
        root1.left.right.right = new BinaryTreeNode(7);

        BinaryTreeNode root2 = new BinaryTreeNode(8);
        root2.left = new BinaryTreeNode(9);
        root2.right = new BinaryTreeNode(3);

        boolean result = hasSubtree(root1, root2);
        if (result) {
            System.out.println("Yes.");
        }else {
            System.out.println("No.");
        }
    }

    //A/B只有一个节点
    private static void test3() {
        BinaryTreeNode root1 = new BinaryTreeNode(8);
        root1.left = new BinaryTreeNode(7);
        BinaryTreeNode root2 = new BinaryTreeNode(8);

        boolean result = hasSubtree(root1, root2);
        if (result) {
            System.out.println("Yes.");
        }else {
            System.out.println("No.");
        }
    }

    //B为空
    private static void test4() {
        BinaryTreeNode root1 = new BinaryTreeNode(8);

        boolean result = hasSubtree(root1, null);
        if (result) {
            System.out.println("Yes.");
        }else {
            System.out.println("No.");
        }       
    }
}

//定义一个二叉树
class BinaryTreeNode{
    int value;
    BinaryTreeNode left;
    BinaryTreeNode right;
    public BinaryTreeNode(int value){
        this.value = value;
        this.left = null;
        this.right = null;
    }
}



有不妥当之处,麻烦告知:D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值