一看题,知道要dfs比较,如果根节点等于子结构的跟节点,要递归的去比较左孩子和子结构的左孩子,右孩子和子结构的右孩子,然后呢?如果出现不等就返回false吗?显然不行,可能左孩子里面包含整体子结构,或者右孩子里面包含整体子结构。
所以需要两个函数,第一个函数,当前树中找到子结构,且必须根节点开始匹配,终止条件呢:如果子结构的根节点为false,那么说明都匹配了,返回true;否则如果根节点为false,说明没有可匹配的了,返回false;
第二个函数,不要求根节点必须与子结构的根节点匹配,如果匹配,那么左孩子和子结构左孩子调用函数一,右孩子和子结构右孩子调研函数一,都返回true则返回true;如果根节点与子结构的根节点不匹配,递归调用本身(左孩子,子结构),递归调用本身(右孩子,子结构)寻找。
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(A==NULL||B==NULL) return false;
return has(A,B);
}
bool has(TreeNode* A, TreeNode* B){
bool res=false;
if(A!=NULL&&B!=NULL){
if(A->val==B->val)
res=dfs(A,B);
if(!res) res=has(A->left,B);
if(!res) res=has(A->right,B);
}
return res;
}
bool dfs(TreeNode* A, TreeNode* B){
if(B==NULL) return true;
if(A==NULL) return false;
if(A->val!=B->val) return false;
return dfs(A->left,B->left)&& dfs(A->right,B->right);
}
};