#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()
{
}
剑指 Offer 26. 树的子结构
最新推荐文章于 2025-05-17 09:22:26 发布