树的子结构问题(判断一棵树root2是否是另一棵树root1的子结构)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hansionz/article/details/82288090
0.题目

判断一棵树root2是否是另一棵树root1的子结构.子结构被定义为
这里写图片描述

1.解题思路
  • 第一步,遍历root1这棵树,寻找和root2根节点相同的结点
  • 第二步,如果找到相同的结点,判断以找到结点为根结点的子树是否和root2这颗树的结构相同
//2.判断以找到结点为根节点的树的结构是否为和root2这棵树的结构相同
int SubTreeIsSub(BTNode* root1, BTNode* root2)
{
    if (root2 == NULL)
        return 1;
    if (root1 == NULL)
        return 0;
    if (root1->_data != root2->_data)
        return 0;
    //根节点相同,递归判断左右子树是否相同
    int ret1 = SubTreeIsSub(root1->_left, root2->_left);
    int ret2 = SubTreeIsSub(root1->_right, root2->_right);
    //如果左右子树都为子结构,说明root2位root1的子结构
    return  ret1 && ret2;
}
//判断root2是不是root1的子结构(是返回1,不是返回0)
//1.遍历root1,找到与root2相同的结点
int IsSubTree(BTNode* root1, BTNode* root2)
{
    //root2为空,必然是root1的子结构
    if (root2 == NULL)
    {
        return 1;
    }
    //root1为空的,而root2不为空,必然不是子结构
    if (root1 == NULL)
    {
        return 0;
    }
    int result = 0;
    //如果根节点的值相同,调用SubTreeIsSub函数判断它的子树是否结构相同
    if (root1->_data == root2->_data)
    {
        result = SubTreeIsSub(root1, root2);
    }
    //SubTreeIsSub函数返回1说明子树也相同,返回0说明子树不相同
    //如果子树不相同,遍历二叉树的左右子树继续寻找下一个与root2根节点相同的
    if (result == 0)
    {
        result = IsSubTree(root1->_left, root2);
    }
    if (result == 0)
    {
        result = IsSubTree(root1->_right, root2);
    }
    return result;
}

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/82288090