【问题】输入两棵二叉树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};