剑指OFFER18 判断一个二叉树的子树

public class a18_IsSubTree {

    public static boolean hasSubTree(TreeNode treeRoot1, TreeNode treeRoot2) {
        boolean result = false;
        if (treeRoot1 != null && treeRoot2 != null) {
            if (treeRoot1.data == treeRoot2.data) {
                result = DoesTree1HasTree2(treeRoot1, treeRoot2);
            }
            if (!result) {
                result = hasSubTree(treeRoot1.left, treeRoot2);
            }
            if (!result)
                result = hasSubTree(treeRoot1.right, treeRoot2);

        }
        return result;
    }

    private static boolean DoesTree1HasTree2(TreeNode treeRoot1, TreeNode treeRoot2) {
        if (treeRoot2 == null)
            return true;
        if (treeRoot1 == null)
            return false;
        if (treeRoot1.data != treeRoot2.data) {
            return false;
        }
        return DoesTree1HasTree2(treeRoot1.left, treeRoot2.left) && DoesTree1HasTree2(treeRoot1.right, treeRoot2.right);

    }

    public static void main(String[] args) {
        TreeNode tree1 = new TreeNode(1);
        TreeNode tree2 = new TreeNode(2);
        TreeNode tree3 = new TreeNode(3);
        TreeNode tree4 = new TreeNode(4);
        TreeNode tree5 = new TreeNode(5);
        TreeNode tree6 = new TreeNode(6);
        TreeNode tree7 = new TreeNode(7);
        TreeNode tree8 = new TreeNode(8);
        tree1.left = tree2;
        tree1.right = tree3;
        tree2.left = tree4;
        tree2.right = tree5;
        tree3.left = tree6;
        tree3.right = tree7;
        tree4.left = tree8;

        TreeNode tree11 = new TreeNode(2);
        TreeNode tree22 = new TreeNode(4);
        TreeNode tree33 = new TreeNode(8);
        tree11.left = tree22;
        tree22.left = tree33;
        System.out.println(hasSubTree(tree1, tree11));

    }

}

class TreeNode {
    int data;
    TreeNode left = null;
    TreeNode right = null;

    TreeNode(int data) {
        this.data = data;
    }
}

 

posted on 2016-04-22 15:54  todayjust  阅读(186)  评论(0编辑  收藏  举报

导航