剑指Offer26.树的子结构
写在前面,小白从零刷题,在解答会写出思路,正确答案,以及所有使用到的语法和知识点
1.递归和hashmap 1
- 递归和hashmap
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
bool res = false;
//当TreeA和TreeB都不为零的时候,才进行比较。否则直接返回false
if (A!=NULL && B!=NULL)
{
//如果找到了对应TreeB的根节点的点
if (A->val == B->val)
//以这个根节点为为起点判断是否包含TreeB
res = helper(A, B);
//如果找不到,那么就再去TreeA的左子树当作起点,去判断是否包含TreeB
if (!res)
res = isSubStructure(A->left, B);
//如果还找不到,那么就再去TreeA的右子树当作起点,去判断是否包含TreeB
if (!res)
res = isSubStructure(A->right, B);
}
// 返回结果
return res;
}
bool helper(TreeNode* A, TreeNode* B)
{
//如果TreeB已经遍历完了都能对应的上,返回true
if (B==NULL)
return true;
//如果TreeB还没有遍历完,TreeA却遍历完了。返回false
if (A==NULL)
return false;
//如果其中有一个点没有对应上,返回false
if (A->val != B->val)
return false;
//如果根节点对应的上,那么就分别去子节点里面匹配
return helper(A->left, B->left) && helper(A->right, B->right);
}
};
时间复杂度/空间复杂度分析/面试场景如何作答
方法一的
- 时间复杂度:O(n),k个节点
- 空间复杂度: 空间复杂度为O(n),具体包括递归时的队列o(h),建立的hashmap,o(n),返回时候的root o(n)。