输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
二叉树类的题一般使用递归,分制求解左右子树的方法
/*struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
//判断树proot2是否是proot1的子结构
bool Dfs(TreeNode* pRoot1, TreeNode* pRoot2) {
//proot2树为空,说明空之前的结点都是相同的
if (pRoot2 == nullptr)
return true;
//proot1树为空,proot2不为空,说明proot1树中没找到树proot2
if (pRoot1 == nullptr)
return false;
//只有当前结点相同,才会向下递归
return pRoot1->val == pRoot2->val
&& Dfs(pRoot1->left, pRoot2->left)
&& Dfs(pRoot1->right, pRoot2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot2 == nullptr || pRoot1 == nullptr)
return false;
//当前树有或者左子树有或者右子树有,都成立
return Dfs(pRoot1, pRoot2) || HasSubtree(pRoot1->left, pRoot2)
|| HasSubtree(pRoot1->right, pRoot2);
}
};