树的子结构:最直观的想法是,使用双指针,一个指针指向A,一个指针指向B,首先遍历树A,然后针对树A的当前结点,判断B是否是以当前结点为根的子树的子结构。
//判断B是否是和以A为根的子树匹配 bool isSame(TreeNode *pRoot1,TreeNode *pRoot2) { //递归出口是如果pRoot2为空则为真 if(!pRoot2) return true; //反之如果pRoot2不为空但是pRoot1为空则为假 else if(!pRoot1) return false; //B和以A为根的子树匹配所需要满足的条件即为:B和A当前节点相等且B的左与A的左匹配且B的右和A的右匹配 return pRoot1->val==pRoot2->val&&isSame(pRoot1->left,pRoot2->left)&&isSame(pRoot1->right,pRoot2->right); } //判断树B是否是树A的子结构 其中是B是整个树A的子结构 并不一定是以A为根节点的 即A的根节点与B的根节点相等的匹配 bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { //递归出口即为A或者B为空树则为false if(!pRoot1||!pRoot2) return false; //B是A的子结构所需要满足的条件即为:B是以A为根节点的子树或者B是A的左孩子树的子结构或者B是A的右孩子的子结构 return isSame(pRoot1,pRoot2)||HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2); }