二叉树
hestyle
戎码一生!
展开
-
数据结构之红黑树(还在为看不懂红黑树而烦恼吗?别再翻了,此篇足矣~)
红黑树,非常经典的数据结构,主要用于一些容器中,比如C++语言中的map、Java语言中的TreeMap(后面会写源码分析博客)。红黑树能保持高效的查找,一般取时间复杂度为O(log2n),由于高效,这个结构也比较复杂,所以很多人(包括我自己)都一直搞不懂红黑树到底是怎么插入、删除节点的。此篇博客,博主将图文并茂的一层一层揭开红黑树神秘面纱。 温馨提示:\color{red}温馨提示:温馨...原创 2020-04-18 17:31:23 · 1443 阅读 · 0 评论 -
数据结构之二叉搜索树详解(附C++代码实现查找、插入、删除操作)
最近在分析分析红黑树时,感觉上来就挑最难的树结构之一进行分析,难度太大,所以特意写这篇二叉搜索树分析的博客作为铺垫。那么为啥挑二叉搜索树进行分析捏?其实红黑树也是一种更为复杂的二叉搜索树,建议阅读一下我的另外一篇博客 数据结构之二叉树、AVL树、红黑树、Trie树、B树、B+树、B*树浅析 。为了帮助大家理解红黑树,先写这篇博客分析二叉搜索树。下面将主要分析二叉搜索树的查找、插入、删除三种操作...原创 2020-04-18 11:21:27 · 1631 阅读 · 2 评论 -
数据结构之二叉树、AVL树、红黑树、Trie树、B树、B+树、B*树浅析
树,作为五大经典数据结构之一,有许多运用场景,比如MySQL数据库的B+树(数据结构的重要性不用强调了吧)。下面将对二叉树、红黑树、B树、B+树等树结构进行一些概念区分与总结,此篇博客适合新手、有一定数据结构基础的小伙伴。一、树的划分 根据子节点的个数可以划分成N叉树(一般N ≥ 2),N叉树拥有的特征是每个节点至多有N个子节点。比如,N = 2时,称为二叉树,每个节点至多只有2个节点...原创 2020-04-07 09:34:30 · 1241 阅读 · 4 评论 -
LeetCode 二叉搜索树结点最小距离(中序遍历)
给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。示例:输入: root = [4,2,6,1,3,null,null]输出: 1解释:注意,root是树结点对象(TreeNode object),而不是数组。给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 ...原创 2019-05-11 10:03:56 · 1026 阅读 · 0 评论 -
LeetCode 第K个语法符号(递归+找规律)
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)例子:输入: N = 1, K = 1输出: 0输入: N = 2, K = 1输出: 0输入: N = 2, K = 2输出: 1输入: N = 4, K = 5输出: 1解释:第一行: 0第二行: 01第三行...原创 2019-05-10 16:10:18 · 6277 阅读 · 0 评论 -
LeetCode 二叉树剪枝(递归)
给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身,以及所有 X 的后代。)示例1:输入: [1,null,0,0,1]输出: [1,null,0,null,1]解释: 只有红色节点满足条件“所有不包含 1 的子树”。右图为返回的答案。示例2:输入: [1,0,1,0,0,0...原创 2019-05-19 11:05:35 · 629 阅读 · 0 评论 -
LeetCode 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \ 1 3在上述示例中...原创 2019-04-25 17:52:57 · 249 阅读 · 0 评论 -
LeetCode 修剪二叉搜索树(递归)
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。示例 1:输入: 1 / \ 0 2 L = 1 R = 2输出: 1 \ 2示例 2:输入: 3 ...原创 2019-04-19 14:30:53 · 304 阅读 · 0 评论 -
LeetCode 二叉树中所有距离为K的节点(后序遍历+深度优先遍历)
给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点...原创 2019-06-08 11:07:21 · 1019 阅读 · 0 评论 -
LeetCode 具有所有最深节点的最小子树(递归)
给定一个根为 root 的二叉树,每个结点的深度是它到根的最短距离。如果一个结点在整个树的任意结点之间具有最大的深度,则该结点是最深的。一个结点的子树是该结点加上它的所有后代的集合。返回能满足“以该结点为根的子树中包含所有最深的结点”这一条件的具有最大深度的结点。示例:输入:[3,5,1,6,2,0,8,null,null,7,4]输出:[2,7,4]解释:我们返回值为 2 的...原创 2019-06-08 19:23:20 · 889 阅读 · 0 评论 -
LeetCode 根据前序和后序遍历构造二叉树(递归+图解)
返回与给定的前序和后序遍历匹配的任何二叉树。pre 和 post 遍历中的值是不同的正整数。示例:输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]输出:[1,2,3,4,5,6,7]提示:1 <= pre.length == post.length <= 30pre[] 和 post[] 都是 1, 2, ..., pre...原创 2019-06-15 10:47:10 · 4515 阅读 · 0 评论 -
LeetCode 叶子相似的树(中序遍历)
请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树。如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。提示:给定的两颗树可能会有 1 到 100...原创 2019-06-10 16:12:03 · 214 阅读 · 0 评论 -
LeetCode 所有可能的满二叉树(递归)
满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。答案中每个树的每个结点都必须有 node.val=0。你可以按任何顺序返回树的最终列表。示例:输入:7输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0...原创 2019-06-16 11:03:16 · 898 阅读 · 0 评论 -
LeetCode 递增顺序查找树(中序遍历)
给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。示例 :输入:[5,3,6,2,4,null,8,1,null,null,null,7,9] 5 / \ 3 6 / \ \ 2 4 8 / / \ 1 7 9输出:[1,nul...原创 2019-06-17 19:01:15 · 446 阅读 · 0 评论 -
LeetCode 完全二叉树插入器(二分查找+图解)
完全二叉树是每一层(除最后一层外)都是完全填充(即,结点数达到最大)的,并且所有的结点都尽可能地集中在左侧。设计一个用完全二叉树初始化的数据结构 CBTInserter,它支持以下几种操作:CBTInserter(TreeNode root) 使用头结点为 root 的给定树初始化该数据结构;CBTInserter.insert(int v) 将 TreeNode 插入到存在值为 node....原创 2019-07-05 21:17:49 · 3036 阅读 · 2 评论 -
LeetCode 二叉树最大深度(递归)
给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \...原创 2019-04-18 16:13:34 · 525 阅读 · 0 评论 -
LeetCode 输出二叉树(图解规律+分治法)
在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:行数 m 应当等于给定二叉树的高度。列数 n 应当总是奇数。根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,...原创 2019-04-18 10:56:12 · 526 阅读 · 0 评论 -
LeetCode 最大二叉树(分治递归)
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。Example 1:输入: [3,2,1,6,0,5]输入: 返回下面这棵树的根节点: 6 / \ ...原创 2019-04-18 10:10:03 · 333 阅读 · 0 评论 -
LeetCode 找树左下角的值
给定一个二叉树,在树的最后一行找到最左边的值。示例 1:输入: 2 / \ 1 3输出:1示例 2:输入: 1 / \ 2 3 / / \ 4 5 6 / 7输出:7注意: 您可以假设树(即给定的根节点)不为 NULL。思路分析: 请先翻阅 Leet...原创 2019-04-06 15:57:06 · 342 阅读 · 0 评论 -
LeetCode 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之...原创 2019-04-10 19:48:39 · 298 阅读 · 0 评论 -
LeetCode 每个树行中找最大值(层次遍历、后序遍历)
您需要在二叉树的每一行中找到最大的值。示例:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9]思路分析: 请先翻阅 LeetCode 二叉树的层次遍历采用层次遍历,从上至下,按层进行访问,每次寻找当前层的最大值。/** * Definition for ...原创 2019-04-07 08:50:58 · 786 阅读 · 0 评论 -
LeetCode 根据二叉树创建字符串(递归)
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例 1:输入: 二叉树: [1,2,3,4] 1 / \ 2 3 / 4 输出: "1(2(4))(3)"解释: 原本将是“1(2...原创 2019-04-15 17:30:56 · 632 阅读 · 0 评论 -
LeetCode 合并二叉树(递归)
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2 1 ...原创 2019-04-15 19:34:49 · 411 阅读 · 0 评论 -
LeetCode 二叉搜索树的最小绝对值(中序遍历)
给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。示例 :输入: 1 \ 3 / 2输出:1解释:最小绝对差为1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。注意: 树中至少有2个节点。思路分析: 首先我们需要知道二叉搜索树的特点:左子树每个节点值都小于root,右子树每一个节点值都大于root(并且左...原创 2019-04-09 10:35:52 · 613 阅读 · 0 评论 -
LeetCode 把二叉搜索树转换为累加树(逆中序遍历)
给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 / \ ...原创 2019-04-09 14:48:08 · 443 阅读 · 0 评论 -
LeetCode 在二叉树中增加一行(递归、辅助队列)
给定一个二叉树,根节点为第1层,深度为 1。在其第 d 层追加一行值为 v 的节点。添加规则:给定一个深度值 d (正整数),针对深度为 d-1 层的每一非空节点 N,为 N 创建两个值为 v 的左子树和右子树。将 N 原先的左子树,连接为新节点 v 的左子树;将 N 原先的右子树,连接为新节点 v 的右子树。如果 d 的值为 1,深度 d - 1 不存在,则创建一个新的根节点 v,原先的整...原创 2019-04-16 09:21:51 · 309 阅读 · 0 评论 -
LeetCode 二叉树的坡度
给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。示例:输入: 1 / \ 2 3输出: 1解释: 结点的坡度 2 : 0结点的坡度 3 : 0结点的坡度 1 : |2-3| = 1树的坡度 : 0 ...原创 2019-04-13 09:00:36 · 304 阅读 · 0 评论 -
LeetCode 另一个树的子树
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值...原创 2019-04-13 14:32:32 · 356 阅读 · 0 评论 -
LeetCode 二叉树的平均值(递归、层序遍历)
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.示例 1:输入: 3 / \ 9 20 / \ 15 7输出: [3, 14.5, 11]解释:第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].注意:节点值的范围在32位有符号整数范围内。思路分析: 我们可以采用先序遍历,得到每...原创 2019-04-16 17:37:01 · 774 阅读 · 0 评论 -
LeetCode 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 保证原始二叉搜索树中不存在新值。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和 插入的值: 5你可以返回...原创 2019-04-25 22:39:00 · 552 阅读 · 0 评论 -
LeetCode 最长同值路径(图解)
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。示例 1:输入: 5 / \ 4 5 / \ \ 1 1 5输出:2示例 2:输入: ...原创 2019-04-22 20:09:09 · 2475 阅读 · 2 评论 -
LeetCode 寻找重复的子树(序列化+hash表)
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。示例 1: 1 / \ 2 3 / / \ 4 2 4 / 4下面是两个重复的子树: 2 / 4和 4因...原创 2019-04-18 09:17:58 · 560 阅读 · 0 评论 -
LeetCode 两数之和IV(hash表、双指针)
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。案例 1:输入: 5 / \ 3 6 / \ \2 4 7Target = 9输出: True案例 2:输入: 5 / \ 3 6 / \ \2 4 7Target = 28输出: False...原创 2019-04-18 09:54:09 · 300 阅读 · 0 评论 -
LeetCode 二叉搜索树中的众数(hash表)
给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2], 1 \ 2 / 2返回[2].提示:如果众数超过1个,不需考虑...原创 2019-04-05 21:19:49 · 723 阅读 · 0 评论