https://blog.csdn.net/derrantcm/article/details/46678157
typedef struct treeNode
{
int m_nValue;
struct treeNode* left;
struct treeNode* right;
} tree;
bool match(tree* rp1, tree* rp2) {
if (rp1 == rp2) {
return true;
}
if (rp2 == NULL) {
// 因为是子序列对比的节点是可以出现NULL的
return true;
}
if (rp1 == NULL) {
// 主序列为空说明这个节点处子结构非法
return false;
}
if (rp1->m_nValue == rp2->m_nValue) {
// 如果两个结点的值相等,则分别判断其左子结点和右子结点
return match(rp1->left, rp2->left) && match(rp1->right, rp2->right);
}
return false;
}
bool subTree(tree* rp1, tree* rp2) {
if (rp2 == NULL) {
// rp2为空
return true;
}
if (rp1 == rp2) {
// 指针地址相同
return true;
}
if (rp1 == NULL) {
// rp1大集合节点为空了
return false;
}
bool ret = false;
if (rp1->m_nValue == rp1->m_nValue) {
// 某一个节点相等,递归看子节点。
ret = match(rp1,rp2);
}
if (ret) {
return true;
}
// 此处相当于先序遍历,看下左或右子树是否存在子结构
return subTree(rp1->left, rp2) || subTree(rp1->right, rp2);
}