【剑指Offer学习】【面试题18 :树的子结构】

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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值