剑指offer JZ-17

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
示例1

输入

复制
{8,8,#,9,#,2,#,5},{8,9,#,2}

返回值

复制
true

思路:

判断树的结构,很明显需要递归。

若p2是p1的子树,则应该同时满足以下条件:

  1.p2->left是p1->left的子树

  2.p2->right是p1->right的子树

  3.p1->val == p2->val;

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if(!pRoot1 || !pRoot2) return false;
        return Check(pRoot1,pRoot2) || Check(pRoot1->left, pRoot2) 
            || Check(pRoot1->right, pRoot2);
    }
    
    bool Check(TreeNode* p1, TreeNode* p2)
    {
        if(p2 && !p1) return false;
        if(!p2) return true;
        if(p1->val != p2->val) return false;
        return Check(p1->left, p2->left) && Check(p1->right,p2->right);
    }
};
View Code
原文地址:https://www.cnblogs.com/alan-W/p/14248821.html