剑指 Offer 26. 树的子结构

#include<iostream>
#include<unordered_map>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
    bool dfs(TreeNode*A,TreeNode*B)
    {//关于为什么要新建一个递归函数 这个函数是判定从两个开始点后其他的地方是不是一样
    //类似于两个for循环的遍历!!!! 子树不子树 就像字符串匹不匹配
    //字符串的匹配都是 for循环从一个点开始然后如果有一处相同 然后再for循环比连续的其他
    //换成树  就是两个递归嵌套!
        if(B==NULL)//如果B为空 那么A不管有无 B都可以算作A的子树
        return true;
        else if(B!=NULL&&A==NULL)//如果B为不为空 而A为空 那么肯定不匹配
        {
            return false;
        }
        else if(A->val==B->val)//如果A与B都不为空 且A B两边的值相同 则证明这个节点相同了
        {//递归去判断他们左儿子右儿子是不是一样
            return dfs(A->left,B->left)&&dfs(A->right,B->right);
        }
        return false;//这种情况是A->val!=B->val 那肯定不对了 直接返回false
    }
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {//第一个递归函数 判断从哪里开始
        if(B==NULL||A==NULL)//如果两边有一个为空 直接返回空
            return false;
        if(dfs(A,B)==true)//从头开始 dfs是判定是不是从A与B开始B是A的子树
        {
            return true;
        }
        else 
        {//如果两边第一个不匹配 就让A的左儿子和右儿子匹配B 看看B是不是A的子树 
            return isSubStructure(A->left,B)||isSubStructure(A->right,B);
        }
    }
};
int main()
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值