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

【思路】首先我们整理下这道题目的思路,首先我们去遍历二叉树A,然后去寻找与二叉树根节点相同的节点,这里我们也使用递归的方法!当找到相同节点后,我们再开始判断从这两个相同节点出发的两棵树是否为子树关系!在判断时,仍然使用递归的思路去遍历,如果root2遍历完了,那么返回true,说明二叉树B是二叉树A的子树。如果root1遍历完了,则返回false,同时必须满足遍历的节点必须相同!

 1/*
 2struct TreeNode {
 3    int val;
 4    struct TreeNode *left;
 5    struct TreeNode *right;
 6    TreeNode(int x) :
 7            val(x), left(NULL), right(NULL) {
 8    }
 9};*/
10class Solution {
11public:
12    bool isSubtree(TreeNode* root1, TreeNode* root2){
13        if(root2 == nullptr)
14            return true;
15        if(root1 == nullptr)
16            return false;
17        return (root1->val == root2->val) && 
18            isSubtree(root1->left, root2->left) && isSubtree(root1->right, root2->right);
19    }
20
21    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
22    {
23        if(pRoot1 == nullptr || pRoot2 == nullptr){
24            return false;
25        }
26        bool result = false;
27        if(pRoot1->val == pRoot2->val){
28            result = isSubtree(pRoot1, pRoot2); 
29        }
30        if(!result){
31            result = HasSubtree(pRoot1->left, pRoot2)
32                  || HasSubtree(pRoot1->right, pRoot2);
33        }
34        return result;
35    }
36};