
树
zxzxin
分享、总结 C++、Java、算法 等技术
展开
-
LeetCode - 208. Implement Trie (Prefix Tree)以及实现字典树(前缀树)
字典树(前缀树)结构字典树的插入统计某个字符串的数量统计以某个字符串为前驱的字符串数量字典树的删除完整测试代码结构 字典树也叫做前缀树,可以存储一组元素(一般是字符串),可以快速的查找某个字符串在树中的个数以及寻找以某个字符串为前缀的字符串的个数,先看下图为一些字符串插入到字典树中的情形。 树中有”abc”,”ab”,”ab”,”abd”,”bc”,”bd”...原创 2018-07-20 16:22:01 · 457 阅读 · 0 评论 -
哈夫曼树和哈夫曼编码总结
目录哈夫曼树的构造哈夫曼编码的构造 哈夫曼树的构造 首先给出树的几个概念: 路径:从树种一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度。 树的路径长度:从树根到每一个结点的路径长度之和。 结点的带权路径长度:为从该结点到树根的之间的路径长度与结点上权的成绩。 树的带权路径长度:为数中所有叶子结点的带权路径...原创 2018-04-21 10:02:20 · 4318 阅读 · 0 评论 -
二叉排序树相关总结
目录二叉排序树相关概念以及性质Find方法(查找二叉树中是否包含指定结点)findMin()方法和findMax方法(递归非递归)insert方法(向树中插入结点)remove方法(删除树中的结点)根据有序数组建立二叉树求出高度以及打印序列完整测试源代码 二叉排序树相关概念以及性质 二叉查找树(Binary Search Tree),也称二叉搜索树,是指一棵空树...原创 2018-04-19 23:04:50 · 1683 阅读 · 2 评论 -
二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)
目录建立二叉树递归前序和非递归前序递归中序和非递归中序递归后续和非递归后续(包括双栈法和设置pre结点)层次遍历寻找树中有没有值为x的结点统计树中结点的个数计算树的高度判断两颗树是不是相等前序中序,中序后续建立二叉树树的子结构二叉树镜像 二叉树建立 可以根据二叉树根节点和左右子结点的下标关系递归建立二叉树,层次输入二叉树结点,递归建立,代码如下:...原创 2018-04-03 19:39:18 · 3825 阅读 · 2 评论 -
平衡二叉树总结
目录平衡二叉树相关概念以及性质平衡二叉树的类结构LL型失衡以及解决办法RR型失衡以及解决办法LR型失衡以及解决办法RL型失衡以及解决办法balance和checkBalance函数完整源码测试 说明 在学二叉平衡树之前,可以先学一下二叉排序树。 在下面的源代码中,设计的二叉查找树的insert方法和remove方法,以及findMin()和findMa...原创 2018-04-20 20:27:11 · 3899 阅读 · 0 评论 -
红黑树总结
目录有序和无序的双向Map: BidiMap循环队列,只读队列,断言队列有序的包,无序的包,Bag,TreeBag,HashBag并集,交集,差集,Set,CollectionUtils.union迭代器的扩展,MapIterator,去重迭代器函数式编程 Closure,IfClosure,WhileClosure函数式编程之Predicate 断言,封装条件类型转换器,解耦...原创 2018-04-11 12:45:39 · 584 阅读 · 0 评论 -
LeetCode - 677. Map Sum Pairs(键值映射)(字典树变形)
LeetCode-677. Map Sum Pairs(键值映射)(字典树变形)题目链接题目解析做这题之前先学字典树基础。这个题目和普通字典树不同的是结点内部存放的是val,一个具体的值,不是path和end。insert()也没什么好说的,注意找到末尾结点之后,维护val;注意求这里的sum,分为两部,第一步先找到对应字符串的结尾结点,然后使用递归来求解它所有孩子...原创 2018-09-08 12:51:18 · 476 阅读 · 0 评论 -
LeetCode - 211. Add and Search Word - Data structure design(字典树和递归)
LeetCode-211. Add and Search Word - Data structure design(字典树和递归)题目链接题目解析首先知道字典树的基本操作。 对于这个题目: addWord()操作没什么好说的,就是向字典树添加元素,记得维护结点的end值;匹配的过程是一个递归的过程,从根结点开始,递归终止条件是node.end > 0(返...原创 2018-09-08 12:26:46 · 699 阅读 · 0 评论 -
LeetCode - 606. Construct String from Binary Tree(根据二叉树生成字符串)
LeetCode606-Construct String from Binary Tree(根据二叉树生成字符串)递归解法非递归解法题目链接题目递归解法递归解法比较简单,自己也写出来了:注意这个题目的意思如果结点node的左右子树为空,则可以省略空的括号"()";如果结点node的右子树为空,也可以省略右子树的括号"()";但是如果结点node的左子树为空就不能省略,...原创 2018-10-12 19:10:34 · 226 阅读 · 0 评论 -
LeetCode - 112. PathSum & Path Sum II(树的路径和问题)(递归和非递归)
LeetCode112-PathSum & LeetCode113-Path SumII(树的路径和问题)(递归和非递归)LeetCode112递归解法LeetCode112非递归LeetCode113递归解法LeetCode113非递归LeetCode112题目链接LeetCode112题目LeetCode112递归解法两种写法,从sum的角度去看,可以从sum减...原创 2018-10-16 17:22:27 · 667 阅读 · 0 评论 -
LeetCode - 617. Merge Two Binary Trees(合并两棵二叉树)
LeetCode617-Merge Two Binary Trees(合并两棵二叉树)递归做法递归优化(改变原有的二叉树结构)非递归前序BFS(层序)题目链接题目递归做法递归的想法很简单,当前的结点的值是t1.val + t2.val,然后当前root.left和right去递归的求解。class Solution { public TreeNode mergeT...原创 2018-10-10 20:18:43 · 294 阅读 · 0 评论 -
LeetCode - 100. Same Tree(判断两棵树是否完全相同)(简单题)
LeetCode100-Same Tree(判断两棵树是否完全相同)(简单题)递归非递归题目链接题目递归这题很简单,本来不想写的,但是还是写一下吧。。分为五种情况:p、q都为空,返回true;p == null && q != null 返回false;p != null && q == null 返回false;p.val != q...原创 2018-10-21 09:55:12 · 201 阅读 · 0 评论 -
LeetCode - 669. Trim a Binary Search Tree(删除搜索树中不在[L,R]范围内的节点)
LeetCode-669. Trim a Binary Search Tree(删除搜索树中不在[L,R]范围内的节点)递归非递归题目链接题目递归解法class Solution { public TreeNode trimBST(TreeNode root, int L, int R) { return helper(root, L, R);...原创 2018-11-29 13:31:45 · 235 阅读 · 0 评论 -
LeetCode - 654. Maximum Binary Tree(最大二叉树)
LeetCode-654. Maximum Binary Tree(最大二叉树)题目链接题目原创 2018-11-30 15:17:11 · 333 阅读 · 0 评论 -
LeetCode - 671. Second Minimum Node In a Binary Tree(寻找二叉树中第二小的结点)
LeetCode671-Second Minimum Node In a Binary Tree(寻找二叉树中第二小的结点)非递归BFS递归DFS题目链接题目非递归BFS使用一个变量min来记录比root.val大的数,而且这个数将会是这些比root.val大的数中的最小的数;直接使用BFS遍历即可,但是这个题目有个性质,这可以让我们优化这个题目,即任意一个结点的孩子结点都...原创 2018-11-28 16:46:54 · 280 阅读 · 0 评论 -
线索二叉树学习总结
目录线索二叉树由来线索二叉树结构中序线索二叉树构造(带头结点)没有设置头结点的前,中,后续二叉线索树构造 线索二叉树由来 两点由来: 空间的浪费 : 在使用二叉链表的存储结构的过程中,会存在大量的空指针域,为了充分利用这些空指针域,引申出了“线索二叉树”。对于一个有n个节点的二叉链表,每个节点有指向左右节点的2个指针域,整个二叉链表存在2n个指针域。而n...原创 2018-04-21 18:23:58 · 1724 阅读 · 1 评论 -
如何直观的打印一颗二叉树
如何直观的打印一颗二叉树 打印的结果是需要顺时针旋转90度的,如下面的结果打印出来是这样的。 如何打印呢? 需要处理以下四个问题 :遍历树的顺序是 右子树->根->左子树因为要 避免数字长度影响对齐的因素,所以 两边补上空格(有一个总长度可以自己确定)在结点的两边加上特定的字符串标记区分孩子和父亲以及位置,使用 H ^ v 这个几个标记和高度...原创 2018-07-18 13:28:53 · 3330 阅读 · 0 评论 -
在一颗二叉树中寻找一个结点的后继结点(前驱结点)
在一颗二叉树树中寻找一个结点的后继结点(前驱结点)找后继结点找前驱结点 找后继结点 首先知道什么是后继结点,就是二叉树中序遍历的序列中,某个结点紧随的那个结点比如下面的二叉树以及对应的中序遍历顺序 则4 的后继是2 ,2的后继是5,7的后继是null。在树的结构中,每个结点有一个指向父亲的域parent,看如下结构 private stati...原创 2018-07-18 14:24:16 · 5528 阅读 · 0 评论 -
线段树总结以及LeetCode - 307. Range Sum Query - Mutable
线段树总结线段树介绍线段树创建线段树查询线段树更新完整测试代码 线段树介绍线段树 : 它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。 线段树解决的是类似下面频繁的对一段区间进行查询的问题: 线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区...原创 2018-08-26 20:04:35 · 2836 阅读 · 0 评论 -
LeetCode - 655. Print Binary Tree(按照字符矩阵的形式打印二叉树)(二分和递归)
LeetCode-655. Print Binary Tree(按照字符矩阵的形式打印二叉树)(二分和递归)题目链接题目解析找出对应的下标,然后二分递归遍历填充,先求出高度h,然后求出宽度为w = 2h-1,然后填充一个h行w列的字符矩阵即可,上下递归和左右二分夹杂在一起的感觉。具体看下图: public List<List<String>&原创 2018-08-25 11:02:03 · 583 阅读 · 0 评论 -
LeetCode - 404. Sum of Left Leaves(左叶子结点之和)(递归和非递归)
LeetCode-404. Sum of Left Leaves(左叶子结点之和)(递归和非递归)递归非递归题目链接题目解析递归当我们访问一个结点的时候,不是判断结点本身是不是左叶子结点(无法判断),而是去判断它的左孩子是不是左叶子结点。而以一个结点为头的左叶子结点的数量是它本身能不能发现左叶子结点,以及它的左右孩子总共得到的左叶子结点的数量之...原创 2018-08-22 10:52:19 · 406 阅读 · 0 评论 -
找到二叉树中的最大搜索二叉子树
找到二叉树中的最大搜索二叉子树套路的写法技巧的写法完整测试代码题目:套路的写法解析: 这种题目的解题过程分为三步: 列出所有可能性;列出结点需要的信息,并整合信息(成一个结构体);改递归 ,先假设左和右都给我信息(黑盒),然后怎么利用左边和右边的信息组出来我该返回的信息,最后basecase(边界)填什么;具体到这个题目: 第一步,列出所有可...原创 2018-08-17 10:30:10 · 1668 阅读 · 0 评论 -
LeetCode - 145. Binary Tree Postorder Traversal(实现后序遍历)(三种非递归方式)
LeetCode-145. Binary Tree Postorder Traversal(实现后序遍历)递归双栈法设置pre结点法morris遍历题目链接递归这个不多说。 public List<Integer> postorderTraversal(TreeNode root) { List&l原创 2018-08-16 16:36:28 · 1026 阅读 · 0 评论 -
LeetCode - 102. Binary Tree Level Order Traversal(层次遍历保存)
LeetCode-102. Binary Tree Level Order Traversal(层次遍历保存)非递归递归 题目链接这个题目和 LeetCode-637基本一样,这个可以说更简单;非递归(BFS) public List<List<Integer>> levelOrder(原创 2018-08-16 13:35:54 · 154 阅读 · 0 评论 -
LeetCode - 637. Average of Levels in Binary Tree(求树的每一层的平均值)
LeetCode-637. Average of Levels in Binary Tree(求树的每一层的平均值)BFS(层次)DFS(前序和中序递归) 题目链接题目BFS(层次)很容易想到的解法就是层次遍历,每次处理一层,先得到队列中所有元素的个数,然后全部处理完,然后处理下一层: /** * BFS做法 */ pub...原创 2018-08-16 11:38:07 · 452 阅读 · 0 评论 -
LintCode - 131. The Skyline Problem(建筑的轮廓)(利用二叉搜索树解决)
LintCode-131. The Skyline Problem(建筑的轮廓)(利用二叉搜索树解决)题目链接题意:解析:解析过程:将输入的每一组数据处理成两个Node结构,结构中是[位置,高度,上升/下降]的信息;对上面的Node结构数组按照位置进行升序排序;准备两个TreeMap,第一个htMap存[高度,次数],第二个pmMap存[位置,最大高度] (注意两...原创 2018-08-15 15:20:17 · 1030 阅读 · 1 评论 -
二叉树结点间的最大距离问题
二叉树结点间的最大距离问题套路的写法改进的写法完整测试代码题目:套路的写法:解析: 这个也是一个二叉树套路化的问题,分为三步: - 列出所有可能性; - 列出结点需要的信息,并整合信息(成一个结构体); - 改递归 ,先假设左和右都给我信息(黑盒),然后怎么利用左边和右边的信息组出来我该返回的信息,最后basecase(边界)填什么;具体到这个题目: ...原创 2018-08-17 12:56:43 · 1831 阅读 · 0 评论 -
LeetCode - 222. Count Complete Tree Nodes(统计完全二叉树的结点个数)
统计完全二叉树的结点个数题目 给出一棵完全二叉树的根节点,求完全二叉树的结点个数,要求时间复杂度小于O(n)。解析 不知道完全二叉树概念看这个博客 遍历整个二叉树的方法是不行的,因为时间复杂度要求小于O(n)。 具体求法如下 : 先求树的高度,也就是看树的最左结点能到哪一层,层数记为h。 然后下面求解要分两种情况,都是递归过程,nod...原创 2018-07-19 15:23:08 · 431 阅读 · 0 评论 -
LeetCode - 98. Validate Binary Search Tree(判断是不是一颗二叉搜索树以及判断完全二叉树)
判断一颗二叉树是不是一颗二叉搜索树,完全二叉树判断一颗二叉树是不是一颗二叉搜索树判断一颗二叉树是不是一颗完全二叉树完整测试代码 判断一颗二叉树是不是一颗二叉搜索树 首先要知道什么是二叉搜索树(二叉排序树)(二叉查找树) : 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点...原创 2018-07-19 11:14:38 · 4308 阅读 · 0 评论 -
LeetCode - 110. Balanced Binary Tree(判断一棵树是否是平衡二叉树)
判断一棵树是否是平衡二叉树套路化的解法简单的写法题目 给定一棵二叉树,判断该二叉树是否是平衡二叉树。解析 这个题目重点是理解使用递归函数的技巧和套路,二叉树中的递归函数不仅仅只是用于遍历,很多二叉树相关的问题都要用到递归来解决,那么如何思考这个问题呢? 首先我们知道平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平...原创 2018-07-19 08:32:46 · 689 阅读 · 0 评论 -
折纸问题
折纸问题题目 请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面.如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕,下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向.例 如 : N =1时,打印 : down ...原创 2018-07-18 23:25:44 · 1277 阅读 · 0 评论 -
LeetCode - 297. Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
二叉树的序列化和反序列化序列化的含义和意义前序序列化和前序反序列化层序序列化和层序反序列化完整测试代码 序列化的含义和意义 含义 序列化就是把二叉树记录成文件的过程(可以是以字符串文本的方式记录)。 通过文件的内容重建二叉树的过程叫做二叉树的反序列化。 前序序列化和前序反序列化 前序序列化,就是将当前的树按照前序的方式生成一个字符串...原创 2018-07-18 16:05:58 · 832 阅读 · 0 评论 -
LeetCode - 687. Longest Univalue Path (树的最长同值路径)
LeetCode - 687. Longest Univalue Path (树的最长同值路径)题目链接题目解析这个题目虽然不难,但是一开始还是没有注意细节:一开始递归函数就是考虑先递归求出左右孩子的最长同值路径;然后如果左孩子和右孩子和自己相同,就更新当前节点返回的最长同值路径;最终答案就是返回以根节点的最长同值路径;但是这种思路对于部分情况是错误的,见下图,因为这里的路径...原创 2019-01-18 11:05:27 · 225 阅读 · 0 评论