1. 预备知识:
子树:包含了一个结点,就得包含这个结点下的所有结点
子结构:包含了一部分,可以只取左子树,右子树,或者都不取(可以是取一个结点,或者是含有下一层中的两个子结点)
2. c++代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
//判断是否是子结构:左子树,结点,右子树
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result = false;
if (pRoot1!= NULL && pRoot2 != NULL){
if (pRoot1->val == pRoot2->val){
//因为不是排序二叉树,可能在不同结点处出现相同值,需要根据子节点进一步判断
result = DoesSubSearch(pRoot1,pRoot2);
}
if (!result){
//判断是否为左子树
result = HasSubtree(pRoot1->left,pRoot2);
}
if (!result){
//判断是否为右子树
result = HasSubtree(pRoot1->right,pRoot2);
}
}
return result;
}
private:
bool DoesSubSearch(TreeNode* pRoot1, TreeNode* pRoot2){
//当b到了叶子结点,而a没有到达,可以是子结构,但是反之不可以
if (pRoot2 == NULL){
return true;
}
if (pRoot1 == NULL){
return false;
}
if (pRoot1->val != pRoot2->val){
return false;
}
return DoesSubSearch(pRoot1->left,pRoot2->left)&&DoesSubSearch(pRoot1->right,pRoot2->right);
}
};
3. 参考链接: