offer--树的子结构

博客讨论了在树的子结构检测问题中,为何原始的先序遍历(DFS)方法可能导致错误,并提出使用广度优先搜索(BFS)来解决。同时指出,子树可以通过序列化与KMP算法进行匹配,但子结构的序列化无法保证在整棵树序列中的连续性,因此不适合用KMP。代码示例展示了如何实现BFS和子树匹配的判断方法。
摘要由CSDN通过智能技术生成

原本想用KMP但忘了怎么写所以看了下评论没想到都没有KMP,多看了两眼才知道不行。记录两段。
原来的先序遍历其实是DFS,由于比较的是子结构,不是子树,所以采用原来的先序遍历会报错,可以调整下遍历算法,采用BFS,这样就没问题了。
子树能用序列化+KMP,子结构不能,因为子结构不管采用何种方式序列化,都不能保证在整棵树的序列化中连续。

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(pRoot1==NULL||pRoot2==NULL) return false;
        return isSubtree(pRoot1,pRoot2)||HasSubtree(pRoot1->left, pRoot2)||HasSubtree(pRoot1->right, pRoot2);
    }
    bool isSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot2==NULL) return true;    //匹配完成,因为前面判断过所以这里肯定不是空,是空说明匹配完成
        if(pRoot1==NULL) return false;   //pRoot2还没空pRoot1已经空了,不匹配
        return pRoot1->val==pRoot2->val && isSubtree(pRoot1->left, pRoot2->left) && isSubtree(pRoot1->right, pRoot2->right);
    }
};

是不是太久没用C++了,分号呀分号!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值