首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Go】剑指offer:二叉树子树判断

作者 | 陌无崖 转载请联系授权 题目要求 判断A,B两个二叉树,B是否是A子树 题目分析 对于这个题,首先我们需要知道二叉树创建,二叉树种类有很多,这一题中我们先回顾一下二叉树基本知识,以二叉查找树为例...二叉树 二叉树是一种存储数据结构,有一个根节点,每个结点都有左右指针,指向一个新结点,称根节点子节点,而子节点也可以有子节点树状结构。...二叉查找树 性质 任意结点倘若它子树不为空,则左子树所有结点值均小于它根节点值。 任意结点倘若它子树不为空,则右子树所有结点值均大于它根节点值。...二叉查找树创建 基于上述性质,我们可以动态创建一个查找树。步骤如下: 传入一个新结点到一颗二叉树。 如果该二叉树根节点为空,则将此结点置为根节点。...,首先应该判断B树根节点是否存在于A树中,如果存在,则继续判断B树左右子树,是否和找到A树中相同根节点左右子树相同。

80510

golang刷leetcode 二叉树(11)寻找重复子树

给定一棵二叉树,返回所有重复子树。对于同一类重复子树,你只需要返回其中任意一棵根结点即可。 两棵树重复是指它们具有相同结构以及相同结点值。...示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4 下面是两个重复子树:...2 / 4 和 4 因此,你需要以列表形式返回上述重复子树根结点。...解题思路: 1,重复子树意思是从根节点到叶子节点一样 2,重复多次只取一个,所以用hash存次数,取次数为2作为解雇 3,虽然前序+中序遍历可以恢复二叉树,但是对于元素值相同不同二叉树,前序,中序遍历结果是一样...和 0 / \ 0 0 4,因此采用leetcode序列化方式,用特殊字符表示孩子是null,然后先序遍历,可以唯一表示一棵子树

14920
您找到你想要的搜索结果了吗?
是的
没有找到

Python算法——树子树

Python中子树判定算法详解 树子树判定是指判断一个树是否是另一棵树子树。在本文中,我们将深入讨论树子树判定问题以及如何通过递归算法来解决。...我们将提供Python代码实现,并详细说明算法原理和步骤。 树子树判定问题 给定两棵二叉树,判断其中一棵树是否是另一棵树子树子树定义是在原树中任意节点与其所有后代形成树。...递归算法求解子树判定问题 递归算法是求解子树判定问题一种常见方法。我们可以递归地判断两个树是否相等,然后在递归地对树子树和右子树进行判定。...s.val == t.val and self.is_same_tree(s.left, t.left) and self.is_same_tree(s.right, t.right) 示例 考虑以下两棵二叉树...:", result) 输出结果: 树2是否是树1子树: True 这表示树2是树1子树

14810

【Leetcode】相同树、对称二叉树、另一颗树子树

相同树 题目描述 给你两棵二叉树根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同值,则认为它们是相同。...题目描述 给你一个二叉树根节点 root , 检查它是否轴对称。...提示: 树中节点数目在范围 [1, 1000] 内 -100 <= Node.val <= 100 思路: 这个题实际上也是判断相同树,只不过是判断对称轴左边子树与对称轴右边子树是否相同和判断对称轴左边子树与对称轴右边子树子树是否相同...二叉树 tree 一棵子树包括 tree 某个节点和这个节点所有后代节点。tree 也可以看做它自身一棵子树。...子树,所以当遇到值相等结点时,仍然需要继续遍历判断。

11510

LeetCode:寻找重复子树_652

序列化二叉树。将二叉树遍历,转成字符串。不过需要注意 中序无法反序列化 中序序列化是不能确定二叉树,前序和后序就行。具体原因还没想清楚,正在LeetCode请教大佬。...image.png 题目 给定一棵二叉树,返回所有重复子树。对于同一类重复子树,你只需要返回其中任意一棵根结点即可。 两棵树重复是指它们具有相同结构以及相同结点值。...示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4 下面是两个重复子树:...2 / 4 和 4 因此,你需要以列表形式返回上述重复子树根结点。...Related Topics 树 深度优先搜索 广度优先搜索 二叉树 324 0 代码 class Solution { private List res = new

20510

另一个树子树二叉树迭代器)

题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值子树。s 一个子树包括 s 一个节点和这个节点所有子孙。s 也可以看做它自身一棵子树。...示例 1: 给定树 s: 3 / \ 4 5 / \ 1 2 给定树 t: 4 / \ 1 2 返回 true,因为 t 与 s 一个子树拥有相同结构和节点值...二叉树迭代器 对树s中每个节点Si,Si与t进行递归比较 Si采用二叉树迭代器产生 该解法相当于暴力查找 class Solution { TreeNode *cur, *temp; stack<...bool isSubtree(TreeNode* s, TreeNode* t) { cur = s; bool ans = false; TreeNode *Si = next();//Si为二叉树每个节点...t)) return false; if(s->val == t->val)//相等,还要继续比较子树 return isSub(s->left,t->left

26610

铁定不纯IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯场景(肯定有副作用,或者操作本身就是副作用)如何解决?...Haskell做法其实类似于ReactcomponentDidMount()等组件生命周期函数,React建议(道德约束)保持render()是纯函数,带有副作用操作挪到componentDidMount...Haskell提供了do语句块,也是用来隔离不纯部分 一.I/O action 先看个函数类型: > :t print print :: Show a => a -> IO () print函数接受一个...但如果编译执行该函数,会发现是逐行处理: $ ./toUpperCase abc ABC efd EFD 这与输入缓冲区有关,具体见Haskell: How getContents works?...,见System.Directory 参考资料 Haskell default io buffering Buffering operations

1.3K30

子结构--判断B是不是A子树

题目描述 输入两棵二叉树A,B,判断B是不是A子结构。(ps:我们约定空树不是任意一个树子结构) 思路 首先找到root1结点值和root2结点值相等点,遍历比对这两个结点子树是否完全一致....需要注意几个点 1.这里可能存在重复值情况存在,因此如果遍历一个结点其子树和比对子树不一致,我们仍然需要向下遍历.如图所示我们比对第一个8,如果比对不成功,我们仍然需要继续比对子树 2.我们在比对子树时候...,如果我们比对当前结点值和目标结点值一致,我们仍然需要比对它左右子树,这里我们必须保证,左右子树必须都要和目标结点左右子树相同才行,因此第二个子树判断函数最后一行代码里用是&&而不是|| 代码:

40020

【Leetcode -965.单值二叉树 -572.另一颗树子树

Leetcode -965.单值二叉树 题目:如果二叉树每个节点都具有相同值,那么该二叉树就是单值二叉树。 只有给定树是单值二叉树时,才返回 true;否则返回 false。...思路:化为子问题比较根值与它左子树和右子树值;结束条件为空,符合要求返回true;值不相等不符合要求返回false; bool isSameVal(struct TreeNode* root,...return isSameVal(root, root->val); } Leetcode -572.另一颗树子树 题目:给你两棵二叉树 root 和 subRoot 。...二叉树 tree 一棵子树包括 tree 某个节点和这个节点所有后代节点。tree 也可以看做它自身一棵子树。...= subRoot->val) return false; //继续比较 root 子树和 subRoot 子树, root 子树和 subRoot 子树

7710

二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树子树二叉树构建及遍历)

1.对称二叉树 题目详情 代码 bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2) { if(root1==NULL...接着右子树也同理 聚焦于递归:函数主体只是比较那个“根”情况,但是每个子节点也是根,递归调用后,他们在他们函数里就是根(所以来判断他们相等或者为空情况),最后都是遇到空(到了整体树叶),就停止了...宏观上:如果当前遍历到节点 root 左右两棵子树都已经翻转,那么我们只需要交换两棵子树位置,就完成了 通过递归方式翻转左子树和右子树,并将左子树指向翻转后子树,右子树指向翻转后子树,...(来判断两个树是不是相同),这题也是看root子树有没有跟subroot有没有相同。...,背后逻辑关系是一样:看似少了一句root->val==subRoot->val,但是本身isSameTree就能进行跟是否相同判断 4.二叉树构建及遍历 传送门 题目详情 代码 #define

10210

热爱函数式你,句句纯正 Haskell【函数篇】

函数本质 Haskell 里变量值在绑定后不会改变,所有变量一定意义上可以理解为定值。 无论如何,定义过值是没法再改变。...Haskell 值与函数是统一,函数只是需要其他参数输入值。如果定义是函数,那么这个函数行为在运行过程中也是不会改变,对于某一个特定输入返回结果总是确定,这样函数为纯函数。...有人觉得不改内存状态想法听上去很荒诞,甚至觉得这样是没有办法做计算。其实,这两种想法都是错误。不改变内存状态自有道理,而其它编程语言可以完成工作,Haskell 一样可以完成。...再三强调,在 Haskell 中,函数与值没有本质区别,它可以是单一定值,也可以是任意两个函数间映射; 实际上,在 Haskell 世界里,所有的运算符号都可以被看做是函数,如加号 + 是一个需要两个参数函数...λ表达式 Haskell 还有另外一种书写函数格式,即 λ 表达式; // 定义方式 3 函数名= (\参数1 -> \参数2 -> ...

32610

从素数生成看Haskell简洁性

最近有空就在看Haskell,真是越看越觉得这个语言有意思。在知乎(原回答@阅千人而惜知己)找到了一份很有意思求素数代码,非常简洁,我觉得很能体现这个语言特点。...然后筛选出不能被p整除剩余数字,递归求解。这里提及一下,[2..]是Haskell列表一个神奇特性,即支持无限列表。这个Haskelllazy特性有很大关系。...yield n it = filter(_not_divisible(n), it) # 构造新序列 看来看去,似乎Haskell版本真的很简单舒服。...这段代码也是Haskell简洁性高度体现。其中,tail想到与后移整个数列,之后通过zipWith函数处理将两个数列相加,以此来达到F(n)=F(n-1)+F(n-2)效果。...虽然说这样高度精简代码由于不直观,并不太适合在实际项目中使用,况且其他语言稍长代码甚至可能在效率上更优,但这仍不影响Haskell表现其独有的简洁及优雅魅力。

30010

另一个树子树

题目描述 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值子树。s 一个子树包括 s 一个节点和这个节点所有子孙。s 也可以看做它自身一棵子树。...示例 1: 给定树 s: 3 / \ 4 5 / \ 1 2 给定树 t: 4 / \ 1 2 返回 true,因为 t 与 s 一个子树拥有相同结构和节点值...题解 首先我们需要一个可以判断二叉树是否是相同树方法,使用递归方式处理,递归结束条件就是 t1 或者 t2 为空,如下: public boolean isEqual(TreeNode t1, TreeNode...= t2.val && isEqual(t1.left, t2.left) && isEqual(t1.right, t2.right); } } 接下来,回到原题,判断树 t 是否是树 s 子树...,同样使用递归,不断判断树 s 子树和右子树,是否包含子树 t,递归结束条件就是树 s 为空,或者树 s 与树 t 相等。

19320

热爱函数式你,句句纯正 Haskell【类型篇】

---- theme: github 每次看到干尸鬼鲛起舞,都有一种说不出难受,不行,发出来,让大家一起难受难受~ Haskell 是一门纯函数式语言。...我们从 wiki 上可以找到以下要点: Haskell 是一种标准化,通用纯函数式编程语言,有惰性求值和强静态类型; 在Haskell中,“函数是第一类对象”。...调试 目前 Haskell 主要编译器是 GHC,下载地址,你可以创建 .hs 文件,用 Notepad++ 打开。 GHCi 是 GHC 一部分,可以解析、调试 Haskell 程序。...上图不在灰色方框内部分全部是类型类; Haskell 给很多“类型”分成了“类型类”,归为一类类型有着共同属性,不同类型所归类就称为类型类。...可以看出,Haskell 严格定义类型和 javaScript 中还是有较大差异,一个强类型,一个弱类型~ 强类型适合大型项目的维护,弱类型与动态性结合,开发简单,处理灵活; Haskell 类型类

92730

寻找重复子树

给定一棵二叉树,返回所有重复子树。对于同一类重复子树,你只需要返回其中任意一棵根结点即可。 两棵树重复是指它们具有相同结构以及相同结点值。...4 和 4 因此,你需要以列表形式返回上述重复子树根结点。...*/ } 我要知道以自己为根子树长啥样,是不是得先知道我左右子树长啥样,再加上自己,就构成了整棵子树样子?...我们可以通过拼接字符串方式把二叉树序列化,看下代码: String traverse(TreeNode root) { // 对于空节点,可以用一个特殊字符表示 if (root ==...right = traverse(root.right); /* 后序遍历代码位置 */ // 左右子树加上自己,就是以自己为根二叉树序列化结果 String subTree

22310

力扣 1519——子树中标签相同节点数

返回一个大小为 n 数组,其中 ans[i] 表示第 i 个节点子树中与节点 i 标签相同节点数。 树 T 中子树是由 T 中某个节点及其所有后代节点组成树。 示例 1: ?...'a' ,以 'a' 为根节点子树中,节点 2 标签也是 'a' ,因此答案为 2 。...注意树中每个节点都是这棵子树一部分。 节点 1 标签为 'b' ,节点 1 子树包含节点 1、4 和 5,但是节点 4、5 标签与节点 1 不同,故而答案为 1(即,该节点本身)。...节点 3 子树中只有节点 3 ,所以答案为 1 。 节点 1 子树中包含节点 1 和 2 ,标签都是 'b' ,因此答案为 2 。...节点 0 子树中包含节点 0、1、2 和 3,标签都是 'b',因此答案为 4 。 示例 3 : ?

44220

验证二叉搜索树

验证二叉搜索树 题目描述 给定一个二叉树,判断其是否是一个有效二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点子树只包含小于当前节点数。 节点子树只包含大于当前节点数。...解题步骤 一个递归函数 isValidBSTCore(root, lower, upper) 来递归判断函数表示考虑以 root 为根子树,判断子树中所有节点值是否都在 (l,r)(l,r) 范围内...如果 root 节点值 val 不在 (l,r)(l,r) 范围内说明不满足条件直接返回 否则我们要继续递归调用检查它左右子树是否满足,如果都满足才说明这是一棵二叉搜索树。...在递归调用时候二叉树每个节点最多被访问一次,因此时间复杂度为 O(n)。 空间复杂度:O(n),其中 n 为二叉树节点个数。...递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外空间且该空间取决于递归深度,即二叉树高度。

63130

热爱函数式你,句句纯正 Haskell【库函数篇】

本篇是笔记篇,介绍 Haskell 强大库函数,也可感受下与我们平常 js 操作异同之处: id 给定一个任何值,都返回这个给定值; Prelude> id "myId" "myId" Prelude...] filter 过滤函数; Prelude> filter (>=7) [9,6,4,2,10,3,15] [9,10,15] 由过滤函数衍生两个判断奇数(odd)偶数(even)函数: Prelude...,当遇到第一个不符合条件元素时停止,将一个列表分成由两个列表组成元组; Prelude> span odd [1,3,5,6,9] ([1,3,5],[6,9]) break 函数则与 span 函数相反...,它会根据一个条件,从左至右,当遇到符合条件时候停止; Prelude> break odd [1,3,5,6,9] ([],[1,3,5,6,9]) takeWhile/dropWhile 之前 ...take 和 drop 函数是通过给定一个整数来取得或者去掉列表中前几个元素,而 takeWhile 和 dropWhile 则需要一个条件来判断,条件不成立时候停止取出或者去除; Prelude>

41620
领券