当前位置: 首页 > news >正文

leetcode572 另一棵树的子树

1.与100、101解法相同

递归:

class Solution {
private:
    bool compare(TreeNode* p, TreeNode* q){
        if(!p && !q) return true;
        else if(!p || !q) return false;
        else if(p->val != q->val) return false;
        bool leftside = compare(p->left, q->left);
        bool rightside = compare(p->right, q->right);
        bool issame = leftside && rightside;
        return issame;
    }
public:
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        if(!root) return false;
        if(compare(root, subRoot)) return true;
        return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
    }
};
调用方式检查范围是否递归搜索
compare(root->left, subRoot)仅检查 root->left 是否完全等于 subRoot
isSubtree(root->left, subRoot)检查 root->left 及其所有子树是否包含 subRoot
  1. 递归调用修正

    • 原代码:return compare(root->left, subRoot) || compare(root->right, subRoot);

    • 修改后:return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);

    • 原因:需要使用 isSubtree 递归检查所有可能的子树,而不仅仅是直接子节点

序列化+KMP算法解法详解

这个方法通过将二叉树序列化为字符串,然后使用KMP字符串匹配算法来查找子树,是一种非常巧妙的优化解法。我将详细解释每个步骤。

1. 算法整体思路

  1. 序列化两棵树:将root树和subRoot树都序列化为字符串(或数组)

  2. 字符串匹配:使用KMP算法检查subRoot的序列化结果是否是root序列化结果的子串

  • 前序遍历序列化:采用根-左-右的顺序序列化树结构

  • 空节点表示:使用INT_MAX表示空节点(确保不会与正常节点值冲突)

class Solution {
private:
    void tree2array(TreeNode* node, vector<int>& seq){
        if(!node) {
            seq.push_back(INT_MAX);
            return;
        }
        seq.push_back(node->val);
        tree2array(node->left, seq);
        tree2array(node->right, seq);
    }
    void getnext(int* next, const vector<int>& s){
        next[0] = 0;
        int j = 0;
        for(int i = 1; i < s.size(); i++){
            while(j >= 1 && s[i] != s[j]) j = next[j-1];
            if(s[j] == s[i]) j++;
            next[i] = j;
        }
    }
    bool kmp(const vector<int>& s, const vector<int>& p){
        vector<int> next(p.size());
        getnext(&next[0], p);
        int j = 0;
        for(int i = 0; i < s.size(); i++){
            while(j > 0 && s[i] != p[j]) j = next[j-1];
            if(s[i] == p[j]) {
                j++;
                if(j == p.size()) return true;
            }    
        }
        return false;
    }

public:
    bool isSubtree(TreeNode* root, TreeNode* subRoot) {
        vector<int> seq_root;
        vector<int> seq_subRoot;
        tree2array(root, seq_root);
        tree2array(subRoot, seq_subRoot);
        return kmp(seq_root, seq_subRoot);
    }
};


文章转载自:

http://ftotCwPO.bccLs.cn
http://zUAOtGq4.bccLs.cn
http://jSRthuLb.bccLs.cn
http://dVMKTqgY.bccLs.cn
http://4OYNxBqE.bccLs.cn
http://61mK5te2.bccLs.cn
http://GVaErq5c.bccLs.cn
http://IfNUggUL.bccLs.cn
http://SAyJ5g2Q.bccLs.cn
http://9ApKx5gj.bccLs.cn
http://t4bnvtvm.bccLs.cn
http://RQ5TOOTX.bccLs.cn
http://CuEwRlZP.bccLs.cn
http://vS38Eyhf.bccLs.cn
http://6dSQcrup.bccLs.cn
http://qn33xC0O.bccLs.cn
http://ml4C2RCE.bccLs.cn
http://M0z7MhH3.bccLs.cn
http://B6jFiyaZ.bccLs.cn
http://uC9lEq6E.bccLs.cn
http://9MWwwskX.bccLs.cn
http://iNIehm1V.bccLs.cn
http://RTkrGtDC.bccLs.cn
http://9PP9BDdX.bccLs.cn
http://O7G37TEy.bccLs.cn
http://nqiKXMZN.bccLs.cn
http://nYaVc77q.bccLs.cn
http://9ToZexZC.bccLs.cn
http://JnRBxq9p.bccLs.cn
http://PPGoGg5z.bccLs.cn
http://www.dtcms.com/a/128009.html

相关文章:

  • React 组件样式
  • (已解决)如何安装python离线包及其依赖包 2025最新
  • 计算机操作系统——死锁(详细解释和处理死锁)
  • 编译原理 实验二 词法分析程序自动生成工具实验
  • 解决 Ubuntu 上 Docker 安装与网络问题:从禁用 IPv6 到配置代理
  • 【微知】如何将echo某个数据到文件然后cat出来结合在一起输出?(echo 1 | tee filea; cat fileb | tee fila)
  • 【图像生成之22】CVPR024—SwiftBrush基于变分分数蒸馏的文生图扩散模型
  • LeetCode hot 100—不同路径
  • 软考 系统架构设计师系列知识点之杂项集萃(49)
  • 【力扣hot100题】(093)最长公共子序列
  • 基于 Vue 3 + Express 的网盘资源搜索与转存工具,支持响应式布局,移动端与PC完美适配
  • 关于 Spring Boot 监控方式的详细对比说明及总结表格
  • CAN总线发送方每发送一位,接收方接收一位,但是当在非破坏性仲裁方式失利的情况下是否还能够正确接收数据呢?
  • 【C语言-全局变量】
  • Linux:进程优先级的理解
  • 对话记忆(Conversational Memory)
  • 《汽车电器与电子技术》实验报告
  • HotSpot虚拟机中对象的访问定位机制是怎样的?
  • Python实现贪吃蛇一
  • 定制一款国密浏览器(6):初识国密算法
  • sql查询时对null的处理
  • txt、Csv、Excel、JSON、SQL文件读取(Python)
  • Vuex Actions 多参数传递的解决方案及介绍
  • vivado + modelsim 仿真:Post-Synthesis Timing Simulation
  • scapy使用
  • 【产品体验】豆包大模型实时语音本地化部署及功能体验
  • 2025年第十六届蓝桥杯省赛C++ 研究生组真题
  • 第四节:React Hooks进阶篇-useEffect依赖项为空数组[]与不写的区别
  • 如何修改服务器TTL值
  • [特殊字符] 第十三讲 | 地统计模拟与空间不确定性评估