判断tl树中是否有与t2树拓扑结构完全相同的子树

左神算法:判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树(Java版) 本题来自左神《程序员代码面试指南》“判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树”题目。 题目 给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 中是否有与 t2 树拓扑结构完全相同 的子树。 例如,如图3-36 所示的 t1 树和如图 3-37 所示的 t2 树。 题解 如果 t1 的节点数为 N,t2 的节点数为 M,则本题最优解是时间复杂度为O(N+M)的方法。 首先简单介绍一个时间复杂度为O(N×M)的方法: 对于 t1 的每棵子树,都去判断是否与 t2 树的拓扑结构完. 阅读详情


两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。

给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。



【解析】把树转化成字符串,用KMP即可。


代码如下:

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

class IdenticalTree {
public:
    bool chkIdentical(TreeNode* A, TreeNode* B) {
        if(A == NULL || B == NULL)
            return false;
        std::string sa = serialize_tree(A);
        std::string sb = serialize_tree(B);
        return KMP(sa.c_str(), sb.c_str(), sa.length(), sb.length()) != -1;
    }
private:
    std::string serialize_tree(TreeNode* t){
        if(t == NULL)
            return std::string("#!");   //都要转化为string类型,所以是双引号,而不是单引号
        std::string res = std::to_string(t->val) + "!";    //数字转化字符串使用to_string即可
        res += serialize_tree(t->left);
        res += serialize_tree(t->right);
        return res;
    }
    int KMP(const char* S, const char* L, const int len_s, const int len_l){
        std::vector<int> next = get_next(L, len_l);
        int i = 0, j = 0;
        while(i < len_s && j < len_l){
            if(j == -1 || S[i] == L[j]){
                ++i;
                ++j;
            }
            else
                j = next[j];
        }
        return j == len_l ? i - j : -1;   //(1)注意是判断j,不是i
    }
    std::vector<int> get_next(const char* L, const int len){
        vector<int> next(len);
        next[0] = -1;
        int j = 0, k = -1;
        while(j < len - 1){    //(2)注意是j<len-1不是j<len
            if(k == -1 || L[k] == L[j])
                next[++j] = ++k;
            else
                k = next[k];
        }
        return next;
    }
};


KMP好久没用了,有两点给写错了,就是注释中的(1)(2)两点,浪费我好一段时间,还有就是数字转化字符串可以使用std::to_string()函数。



PADS VX2.7学习记录05-PADS Layout设计文件Gerber等输出整理 在“PDF Document”栏中,依次选中除REF-TOP和REF-BOT之外的文件,单击图标,将其余PDF Document文件进行删除,如图所示。然后单击【生成PDF】按钮,即可创建一份PDF格式的位号图。 阅读详情

相关推荐

稚晖君Dummy机械臂CAN总线控制详解:从代码到实战(附常见问题排查)

本文深入解析了稚晖君Dummy机械臂的CAN总线控制技术,从协议设计到代码实现,详细介绍了CAN总线在机械臂控制中的核心价值、通信协议栈设计、运动控制指令实现及常见问题排查方法。通过实战案例和代码示例,帮助开发者快速掌握机械臂CAN总线控制的关键技术。

uuu88的博客 296

判断t1树中是否有与t2树拓扑结构完全相同的子树

判断t1树中是否有与t2树拓扑结构完全相同的子树 题目描述 给定彼此独立的两棵二叉树,判断 t1 树是否有与 t2 树拓扑结构完全相同的子树。 设 t1 树的边集为 E1,t2 树的边集为 E2,若 E2 等于 E1 ,则表示 t1 树和t2 树的拓扑结构完全相同。 输入描述: 第一行输入两个整数 n 和 root,n 表示二叉树 t1 的总节点个数,root 表示二叉树 t1 的根节点。 以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为

MIC10086的博客 869

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1482

二叉树问题---判断t1树中是否有与t2树拓扑结构完全相同的子树

说明: 两种方法: 方法1: 对于t1的每棵子树,都去判断是否与t2树的拓扑结构完全一样,这个过程的实践复杂度是O(M),t1的子树共有N棵,所以时间复杂度为O(M*N) 方法2: 首先把t1树和t2树按照先序遍历的方式序列化,之后用KMP算法去判断t2Str是否是t1Str的子串即可。t1的序列化的过程是O(N),t2的序列化是O(M),KMP算法解决匹配问题的复杂度是O(M+N),所以

冰殇的博客 1526

Android13 AudioFlinger混音流程全解析:从prepareTracks_l到threadLoop_write的底层实现

本文深入解析Android13 AudioFlinger混音流程,从prepareTracks_l到threadLoop_write的底层实现。详细剖析MixerThread的核心工作循环,包括音轨预处理、混音算法执行及硬件写入机制,帮助开发者优化音频性能并处理多音轨场景。

tea88的博客 1132

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3041

6-2 是否二叉搜索树 (14分)

本题要求实现函数,判断给定二叉树是否二叉搜索树。 函数接口定义: bool IsBST ( BinTree T ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; ...

sunshineyier的博客 598

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1974

2-3树实现分析

在2-3树中,每个内部节点(非叶子节点)有两个或三个孩子,而且所有叶子都在同一级别上。例如,图1显示高度为3的2-3树。包含两个孩子的节点称为2-节点,二叉树中的节点都是2-节点;包含三个孩子的节点称为3-节点。 图1:高度为3的2-3树 2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。若某棵2-3树不包含3-节点,则看上去像满二叉树,其所有内部节点都可有两个孩子,

__清__风__ 1268

一文读懂客户健康度

什么是客户健康度?客户健康度为什么重要?怎么计算客户健康度?这篇文章,我们来聊聊。

m0_62700043的博客 1420

与OpenClaw同类性质的AI智能体框架/工具汇总(小白友好)

OpenClaw的核心定位是「开源、本地优先、可执行真实任务的AI代理」,核心价值是让AI从“聊天”落地到“动手干活”(操控电脑/服务器、处理办公/系统任务)。结合这一核心,以下是同类性质的工具/框架,按「小白易上手程度」排序,每个产品重点说明和OpenClaw的异同、核心优势及适配场景,方便小白快速区分选择。

hy行者勇哥的博客 2108

2-3 树的实现分析

在2-3树中,每个内部节点(非叶子节点)有两个或三个孩子,而且所有叶子都在同一级别上。例如,图1显示高度为3的2-3树。包含两个孩子的节点称为2-节点,二叉树中的节点都是2-节点;包含三个孩子的节点称为3-节点。 图1:高度为3的2-3树 2-3树不是二叉树,其节点可拥有3个孩子。不过,2-3树与满二叉树相似。若某棵2-3树不包含3-节点,则看上去像满二叉树,其所有内部节点都可有两个孩子,

598

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java学数据结构(2)——树Tree &amp; 二叉树binary tree &amp; 二叉查找树 &amp; AVL树 &amp; 树的遍历_java binarysearchtree

树(Tree)可以用几种方式定义。定义树的一种自然的方式是递归的方式。一棵树是一些节点的集合。这个集合可以是空集;若不是空集,则树由称作根 (root) 的节点 r 以及0个或多个非空的(子)树 T1,T2,…,Tk 组成,这些子树中每一棵的根都被来自根r的一条有向的边(edge)所连结。每一棵子树的根叫作根r的儿子(child),而r是每一棵子树的根的父亲(parent)。

2401_84562425的博客 985

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1、树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录)。一个自然的问题就是,如何实现有效率的查找?

天生爱赞美的博客 4238

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

判断二叉树是否为对称二叉树

牛客题目链接:https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId=46&amp;tqId=29077&amp;tPage=3&amp;rp=3&amp;ru=/ta/leetcode&amp;qru=/ta/leetcode/question-ranki Given a binary tree, chec...

时光、疏离了记忆づ童话的博客 539

AVL树[非常详细有用]

定义:一棵空二叉树是AVL树,如果T是非空二叉树,TL和TR分别是其左子树和右子树, 则当且仅当TL和TR都为AVL树且|HL-HR| 由定义知道一个AVL树的任何节点的左右子树的高度之差不超过1,这是AVL树最基本的特征。 AVL树的高度:(固定节点数计算最大高度) 记N_h为一棵高度为h的AVL树具有的最小节点数,则最坏情况是它的左右子树的高度不等, 一个是N_(h-1)和N_(h-

Effy的学习板 3667

Java学数据结构(2)——树Tree & 二叉树binary tree & 二叉查找树 & AVL树 & 树的遍历

1.树的出现:解决链表线性访问时间太慢,树的时间复杂度O(logN); 2.二叉树的定义,最多两个儿子节点; 3.二叉查找树,左小,右大,中居中;remove方法,两种,只有一个儿子节点,有两个儿子节点; 4.AVL树,在二叉查找树基础上加平衡条件,旋转方法,单旋转,双旋转; 5.树的遍历方式,中序遍历,左根右;后续遍历,左右根;先序遍历,根左右;

Arya的博客,专注后端领域 1198

树与二叉树的解析与实例

树 what`s 树 客观世界中许多事物存在层次关系 分层次组织再管理上具有更高对的效率 层次管理(树) 查找 静态查找:集合中记录是固定的 没有插入和删除操作,只有查找 查字典 动态查找:集合中记录是动态变化的 除查找外,还可能发生插入或删除 静态查找 方法1:顺序查找 数据从1开始存储 哨兵,可以在数组的边界设一个值,无需在每一个循环都判断条件 #include <stdio.h> #include <stdlib.h> #include<iostr

sxycylq的博客 338

通识哈夫曼树及其应用,一起来构造属于自己的哈夫曼树

本文主要介绍了哈夫曼树的背景、算法构造以及实际应用,然后,让我们一起来编写自己的哈夫曼树吧!!!!

Williamtym的博客 2868

数据结构学习——树

树基础(含二叉树的四种遍历方式)

LiuYaoheng的博客 772

AVL树及其搜索树

首先我们先明确两个关于二叉树的基本概念:深度(depth)和高度(height)。 深度:从根节点开始(其深度为1),自顶向下逐层累加; 高度:从叶节点开始(其高度为1),自底向上逐层累加。 虽然树的高度和深度一样,但具体到某个节点,其深度和高度不一样,如: 节点10的高度为2,深度为3;节点7的高度为1,深度为3. 言归正传: AVL树:一个空二叉树是AVL树;一个非空二叉树

2646

AVL树

AVL树 http://www.cnblogs.com/xiao-cheng/archive/2011/10/04/2198972.html 定义:一棵空二叉树是AVL树,如果T是非空二叉树,TL和TR分别是其左子树和右子树, 则当且仅当TL和TR都...

aflwi06660的专栏 144
上一篇: 相邻两数最大差值
下一篇: muduo库的Socket封装
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值