树的子结构
OJ地址:树的子结构
bool dfs(TreeNode *r1, TreeNode *r2)
{
if(r2 == nullptr)
return true;
if(r1 == nullptr)
return false;
//必须根节点的值相同并且左子树的值相等并且右子树的值相等,最后才找到了
return r1->val == r2->val && dfs(r1->left, r2->left) && dfs(r1->right, r2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == nullptr || pRoot2 == nullptr)
return false;
//dfs(pRoot1, pRoot2):先判断两个子树的根节点是否相等
//dfs(pRoot1->left, pRoot2):B数的根节点与A数的根节点不相等,那么就将B数的根节点和A数的左子树的根节点相比较
//dfs(pRoot1->right, pRoot2); 从A数的右节点中找子结构
return dfs(pRoot1, pRoot2) || dfs(pRoot1->left, pRoot2) || dfs(pRoot1->right, pRoot2);
}
【时间复杂度】O(m)
m为A树的节点数,n为B树的节点数。首先A树中的每个节点必须遍历一次,然后A树中最多有(m/n)个与B树的根节点相等,然后(m/n)n=m,所以时间复杂度为O(2m)