题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
提交链接:点击
思路:判断是否子树,首先在A中递归遍历找到和B树根节点相同的节点R,然后对以R节点为根节点开始的子树和B子树进行“是否完全一样”的比较。这里也利用递归遍历,首先进行判断t2,然后进行根节点判断,看是否一样,如果一样,则递归进行左右子树判断。
代码:
/* 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) { //先在A中找到和B根节点一样的节点,然后分别判断B中根节点左子树、右子树是否是A中一样 bool flag=false; if(pRoot2==NULL || pRoot1==NULL) return false; if(pRoot1->val == pRoot2->val) flag=isSubtree(pRoot1,pRoot2); if(!flag){ flag=HasSubtree(pRoot1->left,pRoot2); } if(!flag){ flag=HasSubtree(pRoot1->right,pRoot2); } return flag; //return isSubtree(pRoot1,pRoot2)||isSubtree(pRoot1->left,pRoot2)||isSubtree(pRoot1->right,pRoot2); } bool isSubtree(TreeNode* t1,TreeNode* t2){ if(t2==NULL) return true; //t2遍历完了,返回true if(t1==NULL) return false; //t1遍历完,t2还没有遍历完,返回false if(t1->val==t2->val) return isSubtree(t1->left,t2->left) && isSubtree(t1->right,t2->right); else return false; } };