题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:两个递归函数,一个负责遍历树A;另一个负责判断由树A中某一个节点作为根节点的子树是否和树B结构一样
bool isSubTree(TreeNode *pRoot1, TreeNode *pRoot2)//判断是否为子树函数 { if(!pRoot2)return true; if(!pRoot1)return false; if(pRoot1->val != pRoot2->val)return false; return isSubTree(pRoot1->left, pRoot2->left) && isSubTree(pRoot1->right, pRoot2->right); } void DFS(TreeNode *pRoot1, TreeNode *pRoot2, bool &res)//遍历函数 { if(res==true)return;//如果res已经被置为true,提前终止,避免无谓的判断 if(pRoot1->val == pRoot2->val)res=isSubTree(pRoot1->left, pRoot2->left) && isSubTree(pRoot1->right, pRoot2->right); if(pRoot1->left)DFS(pRoot1->left, pRoot2, res); if(pRoot1->right)DFS(pRoot1->right, pRoot2, res); } class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool res=false; if(!pRoot1 || !pRoot2)return res; DFS(pRoot1, pRoot2, res); return res; } };