【算法题目】树的子结构

  题目来源:《剑指offer》面试题18

  输入两颗二叉树A和B,判断B是不是A的子结构。二叉树的节点定义如下:

struct BinaryTreeNode {
    int    value;
    BinaryTreeNode*    left;
    BinaryTreeNode*    right;
};

 

  要查找A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和B的根节点的值一样的节点R,然后再判断树A中以R为根节点的子树是不是包含和树B一样的结构。

  

bool HasSubTree(BinaryTreeNode* root1, BinaryTreeNode* root2) {
    if (root1 == NULL) return false;

    bool flag = false;

    if (root1->value == root2->value)
        flag = DoesTree1HasTree2(root1, root2);

    if (!flag)
        flag = HasSubTree(root1->left, root2);

    if (!flag)
        flag = HasSubTree(root1->left, root2);

    return flag;
}

bool DoesTree1HasTree2(BinaryTreeNode* root1, BinaryTreeNode* root2) {
    if (root2 == NULL)
        return true;

    if (root1 == NULL)
        return false;

    if (root1->val != root2->val)
        return false;

    return DoesTree1HasTree2(root1->left, root2) && DoesTree1HasTree2(root1->right, root2);
}

 

posted @ 2015-09-01 17:02  vincently  阅读(424)  评论(0编辑  收藏  举报