/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//时间复杂度为o(nm),n为root1节点,m为root2节点数。
//二叉树,递归遍历
//hasSubtree函数中,主要遍历数A的每个点,并以其为根节点与树B进行匹配判断;
//issame中,主要是先判断该节点,然后递归判断两树的左右孩子节点是否匹配。
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1||!pRoot2) return false ; //如果为空树,则直接返回false,判断一下边界条件。
if(issame(pRoot1,pRoot2)) return true; //如果树A与树B符合题意,则返回TRUE,issame函数由下面定义,是一个判断两个树是否符合题意的函数
return hasSubtree(pRoot1->left,pRoot2)||hasSubtree(pRoot1->right,pRoot2);//如果树A根节点不符合题意,则以树A左右孩子为根根树B匹配判断。
}
bool issame(TreeNode*a,TreeNode*b) //写一个匹配函数issame
{
if(!b) return true; //如果树B没有节点了,说明树A与树B已完全匹配,所以直接返回TRUE即可;
if(!a||a->val!=b->val) return false; //如果树A没有相应节点与B匹配,或A相应节点和B不匹配则直接返回false;
return issame(a->left,b->left)&&issame(a->right,b->right);//判断完该节点后还要继续用issame递归判断各自左右节点是否匹配。
}
};