题目地址
我的思路是判断当前结点是否匹配,若匹配则返回true,否则继续判断它的两个子树。
判断匹配的过程是这样的:
- 当前结点值不相等则返回false,否则继续。
- 判断当前结点的两个子树。
代码如下:
private:
bool judge(TreeNode* A, TreeNode* B) {
// 不论是isSubStructure还是judge的递归调用都保证了B不会是nullptr
// 因此当A为空时一定是不匹配的
if (A == nullptr || A->val != B->val)
return false;
// A和B的val相等
if (B->left == nullptr && B->right == nullptr)
return true;
else if (B->left == nullptr)
return judge(A->right, B->right);
else if (B->right == nullptr)
return judge(A->left, B->left);
else
return (judge(A->left, B->left) && judge(A->right, B->right));
}
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if (A == nullptr || B == nullptr)
return false;
// 判断当前结点,若不匹配则继续判断其两个子树
if (judge(A, B) || isSubStructure(A->left, B) || isSubStructure(A->right, B))
return true;
return false;
}
另外有一点,judge()函数我之前写的是这样:
if (A == nullptr)
return false;
if (A->val == B->val) {
// ...
}
else
return false;
因为发现两个返回false的情况可以合并,就改成了上面的代码。但是速度却降低了不少。
在力扣上不合并的版本运行速度为40ms,而合并后变成了44ms,不知道是为什么。