![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构 二叉树
文章平均质量分 69
温酒知莲华
这个作者很懒,什么都没留下…
展开
-
[LintCode]73.前序遍历和中序遍历树构造二叉树
根据前序遍历和中序遍历树构造二叉树.注意事项:你可以假设树中不存在相同数值的节点样例:给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \1 3一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树。根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0原创 2017-08-04 23:56:47 · 418 阅读 · 0 评论 -
[LintCode]66.二叉树的前序遍历
给出一棵二叉树,返回其节点值的前序遍历。样例给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]./** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *rig原创 2017-08-31 16:30:12 · 258 阅读 · 0 评论 -
[LintCode]67.二叉树的中序遍历
给出一棵二叉树,返回其中序遍历样例给出二叉树 {1,#,2,3}, 1 \ 2 / 3返回 [1,3,2]./** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; *原创 2017-08-31 16:32:41 · 228 阅读 · 0 评论 -
[LintCode]7.二叉树的序列化和反序列化
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。 注意事项There is no limit of how you deserialize or serialize a原创 2017-08-31 19:32:29 · 304 阅读 · 0 评论 -
平衡二叉树判断 后序遍历
有一棵二叉树,请设计一个算法判断这棵二叉树是否为平衡二叉树。给定二叉树的根结点root,请返回一个bool值,代表这棵树是否为平衡二叉树。思路:左子树是否为平衡二叉树,左子树最深到哪一层;右子树是否为平衡二叉树,右子树最深到哪一层;如果左右子树都是平衡二叉树,比较它们的层数差。/*struct TreeNode { int val; struct Tree原创 2017-08-31 20:35:15 · 716 阅读 · 0 评论 -
[LintCode]95.验证二叉查找树(二叉排序树/二叉搜索树) 中序遍历
给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:节点的左子树中的值要严格小于该节点的值。节点的右子树中的值要严格大于该节点的值。左右子树也必须是二叉查找树。一个节点的树也是二叉查找树。样例一个例子: 2 / \1 4 / \ 3 5上述这棵二叉树序列化为 {2,1,4,#,#,3,5}.思路:观察二叉查找原创 2017-08-31 20:09:45 · 1662 阅读 · 0 评论 -
完全二叉树判断 层次遍历
有一棵二叉树,请设计一个算法判断它是否是完全二叉树。给定二叉树的根结点root,请返回一个bool值代表它是否为完全二叉树。树的结点个数小于等于500。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2017-08-31 21:52:38 · 1612 阅读 · 0 评论 -
折纸
请把纸条竖着放在桌⼦上,然后从纸条的下边向上⽅对折,压出折痕后再展 开。此时有1条折痕,突起的⽅向指向纸条的背⾯,这条折痕叫做“下”折痕 ;突起的⽅向指向纸条正⾯的折痕叫做“上”折痕。如果每次都从下边向上⽅ 对折,对折N次。请从上到下计算出所有折痕的⽅向。给定折的次数n,请返回从上到下的折痕的数组,若为下折痕则对应元素为"down",若为上折痕则为"up".测试样例:1原创 2017-09-01 10:32:36 · 249 阅读 · 0 评论 -
寻找错误结点 中序遍历
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。思路:修改中序遍历/*struct TreeNode { int val; struct TreeNode *left; struc原创 2017-09-01 11:02:32 · 278 阅读 · 0 评论 -
最大二叉搜索子树 后序遍历
有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。原创 2017-09-01 16:42:05 · 357 阅读 · 0 评论 -
树上最远距离 后序遍历
从二叉树的节点A出发,可以向上或者向下走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。对于给定的一棵二叉树,求整棵树上节点间的最大距离。给定一个二叉树的头结点root,请返回最大距离。保证点数大于等于2小于等于500.思路:修改后序遍历/*struct TreeNode { int val; struct TreeNode *原创 2017-09-01 13:17:20 · 246 阅读 · 0 评论 -
[LintCode]175.翻转二叉树
翻转一棵二叉树样例 1 1 / \ / \2 3 => 3 2 / \ 4 4/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right;原创 2017-10-02 14:38:07 · 300 阅读 · 0 评论 -
[LintCode]469.等价二叉树
检查两棵二叉树是否等价。等价的意思是说,首先两棵二叉树必须拥有相同的结构,并且每个对应位置上的节点上的数都相等。样例 1 1 / \ / \ 2 2 and 2 2 / /4 4就是两棵等价的二叉树。 1 1 /原创 2017-10-02 14:59:07 · 263 阅读 · 0 评论 -
非递归二叉树的序列打印
请用非递归方式实现二叉树的先序、中序和后序的遍历打印。给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2017-08-31 16:27:19 · 215 阅读 · 0 评论 -
递归二叉树的序列打印
请用递归方式实现二叉树的先序、中序和后序的遍历打印。给定一个二叉树的根结点root,请依次返回二叉树的先序,中序和后续遍历(二维数组的形式)。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2017-08-31 15:58:56 · 310 阅读 · 0 评论 -
[LintCode]376.二叉树的路径和
给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。一个有效的路径,指的是从根节点到叶节点的路径。样例给定一个二叉树,和 目标值 = 5: 1 / \ 2 4 / \ 2 3返回:[ [1, 2, 2], [1, 4]]思路:首先找到叶子节点,这样从根节点到叶子结点才是路径原创 2017-08-17 22:04:41 · 426 阅读 · 0 评论 -
[LintCode]375.克隆二叉树
深度复制一个二叉树。给定一个二叉树,返回一个他的 克隆品 。样例给定一个二叉树: 1 / \ 2 3 / \4 5返回其相同结构相同数值的克隆二叉树: 1 / \ 2 3 / \4 5思路:建立一个新的二叉树,它的根节点为原二叉树的根节点,再用克隆的函数遍历原二叉原创 2017-08-17 22:17:45 · 247 阅读 · 0 评论 -
[LintCode]69.二叉树的层次遍历
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)样例给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7返回他的分层遍历结果:[ [3], [9,20], [15,7]]用一个队列实现,队列保存每层的节点,以此遍历每层。 广度优先遍历?层次遍历要原创 2017-08-17 23:29:22 · 268 阅读 · 0 评论 -
[LintCode]68.二叉树的后序遍历
给出一棵二叉树,返回其节点值的后序遍历。样例给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3返回 [3,2,1]思路:用两个栈实现后序遍历的过程,具体过程如下:1.申请一个栈,记为s1,然后将头节点压入s1中。2.从s1中弹出的节点,然后依次将节点的左孩子和右孩子压入s1中。3.在整个过程中,每一个从s1中弹出的节原创 2017-08-18 00:06:53 · 234 阅读 · 0 评论 -
[LintCode]378.将二叉查找树转换成双链表
将一个二叉查找树按照中序遍历转换成双向链表。样例给定一个二叉查找树: 4 / \ 2 5 / \1 3返回 12345。二叉查找树是满足以下条件的二叉树:1.左子树上的所有节点值均小于根节点值,2右子树上的所有节点值均不小于根节点值,3,左右子树也满足上述两个条件。思路:把二叉查找树的值按照中序遍历的顺序存到数组vector中,再把原创 2017-08-18 01:35:49 · 730 阅读 · 0 评论 -
[LintCode]97.二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的距离。样例给出一棵如下的二叉树: 1 / \ 2 3 / \ 4 5这个二叉树的最大深度为3.思路:递归/** * Definition of TreeNode: * class TreeNode { * public: * int va原创 2017-08-19 19:49:10 · 818 阅读 · 0 评论 -
[LintCode]88.最近公共祖先
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。最近公共祖先是两个节点的公共的祖先节点且具有最大深度。 注意事项假设给出的两个节点都在树中存在样例对于下面这棵二叉树 4 / \3 7 / \ 5 6LCA(3, 5) = 4LCA(5, 6) = 7LCA(6, 7) = 7思路:递归查找。先原创 2017-08-20 00:25:24 · 488 阅读 · 0 评论 -
[LintCode]245.子树
有两个不同大小的二进制树: T1 有上百万的节点; T2 有好几百的节点。请设计一种算法,判定 T2 是否为 T1的子树。 注意事项若 T1 中存在从节点 n 开始的子树与 T2 相同,我们称 T2 是 T1 的子树。也就是说,如果在 T1 节点 n 处将树砍断,砍断的部分将与 T2 完全相同。样例下面的例子中 T2 是 T1 的子树: 1原创 2017-08-10 18:01:17 · 315 阅读 · 0 评论 -
拓扑结构相同子树 类似[LintCode]245
对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。思路:一、把二叉树的值转换成字符串 二、查找字符串a是否包含子串b,用strA.find(strB) != string:npos/*struct原创 2017-08-27 16:01:23 · 371 阅读 · 0 评论 -
[LintCode]480.二叉树的所有路径
给一棵二叉树,找出从根节点到叶子节点的所有路径。样例给出下面这棵二叉树: 1 / \2 3 \ 5所有根到叶子的路径为:[ "1->2->5", "1->3"]思路:深度优先搜索 dfs实现 + 回溯 。注意加->这种细节。/** * Definition of TreeNode: * class TreeNode原创 2017-09-08 00:11:17 · 262 阅读 · 0 评论 -
带权路径长度 层次遍历
思路:层次遍历带权路径长度:结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度。叶子结点的带权路径长度:从叶结点到根之间的路径长度(所在层数-1)乘以叶结点的权值。树的带权路径长度(WPL):树的所有叶子结点的带权路径长度之和。树的带权路径长度记为WPL = (W1*L1 + W2*L2 + W3*L3 + ... + Wn*Ln),N个权原创 2017-09-08 01:05:37 · 1156 阅读 · 0 评论 -
完全二叉树计数
给定一棵完全二叉树的根节点root,返回这棵树的节点个数。如果完全二叉树的节点数为N,请实现时间复杂度低于O(N)的解法。给定树的根结点root,请返回树的大小。思路:深度为h的二叉树至多有2h-1个结点(h>=1)。换句话说,满二叉树中前k层的结点个数为2h-1。/*struct TreeNode { int val; struct TreeNode *原创 2017-08-31 00:06:52 · 319 阅读 · 0 评论 -
[LintCode]104.合并k个排序链表
合并k个排序链表,并且返回合并后的排序链表。尝试分析和描述其复杂度。样例:给出3个排序链表[2->4->null,null,-1->null],返回 -1->2->4->null/** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; *原创 2017-10-05 14:38:07 · 375 阅读 · 0 评论