剑指offer26:树的子结构

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

如上图,其中B为A的子结构.

思路: 判断是否为子树,首先需要定位到子树的根节点,然后对两颗树的左右子节点进行对比. 首先取A中根节点与B根节点对比,若值相等,则对比二者的左右子树. 当B树走到叶子节点时,表明这一条路径相等. 若根节点不等,则在左子树上寻找,若左子树没有,则去右子树寻找. 整个过程采用递归实现。

bool IsSubTree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot2==nullptr)
            return true;
        if(pRoot1 ==nullptr && pRoot2!=nullptr)
            return false;
        if(pRoot1->val != pRoot2->val)
            return false;
        return IsSubTree(pRoot1->left, pRoot2->left) && IsSubTree(pRoot1->right, pRoot2->right);
    }

bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot1==nullptr || pRoot2==nullptr)
            return false;
        bool flag=false;
        if(pRoot1->val==pRoot2->val){
             flag = IsSubTree(pRoot1, pRoot2);
        }
        if(!flag){
            if(pRoot1->left!=nullptr){
                flag= HasSubtree(pRoot1->left, pRoot2);
            }
        }
        if(!flag){
            if(pRoot1->right!=nullptr){
                flag= HasSubtree(pRoot1->right, pRoot2);
            }
        }
        return flag;
    }