1.题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
2.问题描述
1 3
2 3 6 7
4 5 6 7
8
- 第一:先判断树A,树B的根节点是否满足要求;
- 第二,判断树A的左子树,树B的根节点是否满足要求;
- 第三,判断树A的右子树,树B的根节点是否满足要求。
其余分析见源代码
3.源代码
//从pRoot1根节点与pRoot2的根节点开始做比较,pRoot1是否包含pRoot2
bool HasSubtreeCore(TreeNode* pRoot1, TreeNode* pRoot2)
{
//树2已结遍历完了,所以的值都对应上了,则返回true
if(pRoot2 == NULL)
return true;
//树1已结遍历完了,但是树2还没有遍历完,则返回false
if(pRoot1 == NULL && pRoot2 != NULL)
return false;
//两个值不相等,则返回false
if(pRoot1->val != pRoot2->val)
return false;
return HasSubtreeCore(pRoot1->left,pRoot2->left) && HasSubtreeCore(pRoot1->right,pRoot2->right);
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL || pRoot2 == NULL)
return false;
//pRoot1与pRoot1做比较,pRoot1->left与pRoot2做比较,pRoot1->right与pRoot2做比较
return HasSubtreeCore(pRoot1,pRoot2) || HasSubtree(pRoot1->left,pRoot2) || HasSubtree(pRoot1->right,pRoot2);
}