剑指Offer——树的子结构
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
分析:
先匹配到A的某个结点和B的根相同,然后往下继续匹配。不匹配则递归匹配左右子树。
代码:
1 /* 2 struct 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 };*/ 10 class Solution { 11 public: 12 bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { 13 if(pRoot1 == NULL || pRoot2 == NULL) return false; 14 if(pRoot1->val == pRoot2->val && MyHasSubtree(pRoot1, pRoot2)) { // 找到与根相同的结点才往下判断 15 return true; 16 } 17 return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2); // 查找A的左右子树是不是含有B树 18 } 19 20 bool MyHasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { 21 if(pRoot2 == NULL) return true; // B树匹配到叶子结点了,说明B是A的子结构 22 if(pRoot1 == NULL) return false; // B没到叶子结点,A就已经到了叶子结点,说明B还没匹配完 23 if(pRoot1->val == pRoot2->val) { 24 return MyHasSubtree(pRoot1->left, pRoot2->left) && MyHasSubtree(pRoot1->right, pRoot2->right); 25 } 26 return false; 27 } 28 };