面试题18 :树的子结构

题目:输入两颗二叉树 A 和 B,判断 B 是不是 A 的子结构。

先判断根结点,相等,判断左右孩子结点,有一个不是,重新寻找根结点。

package offer;
import java.sql.Struct;
//面试题 18:树的子结构
//题目:输入两颗二叉树 A 和 B,判断 B 是不是 A 的子结构。
public class Problem18 {
    static class BinaryTreeNode {
        int value;
        BinaryTreeNode leftNode;
        BinaryTreeNode rightNode;
    }
    public static void main(String args[]) {    
        BinaryTreeNode root1 = new BinaryTreeNode();
        BinaryTreeNode node1 = new BinaryTreeNode();
        BinaryTreeNode node2 = new BinaryTreeNode();
        BinaryTreeNode node3 = new BinaryTreeNode();
        BinaryTreeNode node4 = new BinaryTreeNode();
        BinaryTreeNode node5 = new BinaryTreeNode();
        BinaryTreeNode node6 = new BinaryTreeNode();
        root1.leftNode = node1;
        root1.rightNode = node2;
        node1.leftNode = node3;
        node1.rightNode = node4;
        node4.leftNode = node5;
        node4.rightNode = node6;
        root1.value = 8;
        node1.value = 8;
        node2.value = 7;
        node3.value = 9;
        node4.value = 2;
        node5.value = 4;
        node6.value = 7;
        BinaryTreeNode root2 = new BinaryTreeNode();
        BinaryTreeNode a = new BinaryTreeNode();
        BinaryTreeNode b = new BinaryTreeNode();
        root2.leftNode = a;
        root2.rightNode = b;
        root2.value = 8;
        a.value = 9;
        b.value = 2;
        Problem18 test = new Problem18();
        System.out.println(test.hasSubTree(root1, root2));
    }
    public boolean hasSubTree(BinaryTreeNode root1, BinaryTreeNode root2) {
        boolean result = false;
        if (root1 != null && root2 != null) {
            if (root1.value == root2.value) {
                result = doesTree1HavaTree2(root1, root2);
                if (!result)
                    result = hasSubTree(root1.leftNode, root2);
                if (!result)
                    result = hasSubTree(root1.rightNode, root2);
            }
        }
        return result;
    }
    private boolean doesTree1HavaTree2(BinaryTreeNode root1, BinaryTreeNode root2) {
        if (root2 == null) {
            return true;
        }else if (root1 == null)
            return false;
        if (root1.value != root2.value) {
            return false;
        }
        return doesTree1HavaTree2(root1.leftNode, root2.leftNode)
                && doesTree1HavaTree2(root1.rightNode, root2.rightNode);
    }
}
原文地址:https://www.cnblogs.com/newcoder/p/5797172.html