题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
建立一个函数isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2)判断第二个是不是第一个的子结构且是从根节点开始匹配相同的。
然后在HasSubtree中前序遍历判断是否isSubtreeWithSameRoot。
需要注意的是,子结构不需要是某个“叶结构”,只要是树的一个部分就是它的子结构。
/* 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; if (isSubtreeWithSameRoot(pRoot1, pRoot2)) return true; if (HasSubtree(pRoot1->left, pRoot2)) return true; if (HasSubtree(pRoot1->right, pRoot2)) return true; return false; } bool isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2) { if (!pRoot1 && pRoot2) return false; if (!pRoot2) return true; if (pRoot1->val != pRoot2->val) return false; return isSubtreeWithSameRoot(pRoot1->left, pRoot2->left) && isSubtreeWithSameRoot(pRoot1->right, pRoot2->right); } };