算法----二叉树
sunlanchang
北京邮电大学-计算机硕士,sunlanchang@bupt.edu.cn
展开
-
Leetcode 662. 二叉树最大宽度
Description给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:输入: 1 / \ 3 2 / \ \ 5 3 9 输出: 4解释: 最大值原创 2021-08-09 16:30:33 · 246 阅读 · 0 评论 -
LeetCode 222. 完全二叉树的节点个数
Description给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入: 1 / \ 2 3 / \ /4 5 6输出: 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-complet原创 2020-11-24 11:38:16 · 183 阅读 · 0 评论 -
LeetCode 116. 填充每个节点的下一个右侧节点指针
Description给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。来源:力扣(LeetCode)链接:https://leetcode原创 2020-10-15 11:34:03 · 123 阅读 · 0 评论 -
LeetCode 106. 从中序与后序遍历序列构造二叉树
Description根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inor原创 2020-09-25 10:03:41 · 143 阅读 · 0 评论 -
LeetCode 129. 求根到叶子节点数字之和
Description给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12原创 2020-09-20 10:29:26 · 211 阅读 · 0 评论 -
LeetCode 404. 左叶子之和
Description计算给定二叉树的所有左叶子之和。示例: 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sum-of-left-leaves著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。Solution本质就是一个前序遍历。class Solution:原创 2020-09-19 10:54:33 · 358 阅读 · 0 评论 -
LeetCode 226. 翻转二叉树
Description翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/invert-binary-tree著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。Solution本质就是一原创 2020-09-16 10:24:18 · 114 阅读 · 0 评论 -
LeetCode 958. 二叉树的完全性检验
Description给定一个二叉树,确定它是否是一个完全二叉树。百度百科中对完全二叉树的定义如下:若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)示例 1:输入:[1,2,3,4,5,6]输出:true解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。原创 2020-09-15 20:57:46 · 187 阅读 · 0 评论 -
LeetCode 437. 路径总和 III
Description给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3原创 2020-09-15 20:20:23 · 118 阅读 · 0 评论 -
LeetCode 103. 二叉树的锯齿形层次遍历
Description给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[ [3], [20,9], [15,7]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tre原创 2020-09-14 21:37:17 · 159 阅读 · 0 评论 -
LeetCode 剑指 Offer 55 - II. 平衡二叉树
Description输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 /原创 2020-09-13 21:36:02 · 124 阅读 · 0 评论 -
LeetCode 257. 二叉树的所有路径
Description给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-paths著作权归领扣网络所有。商原创 2020-09-04 12:00:11 · 104 阅读 · 0 评论 -
LeetCode 剑指 Offer 54. 二叉搜索树的第k大节点 (中序遍历变形)
Description给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4来源:力扣(LeetCode)链接:https://leetcode-cn原创 2020-09-03 16:09:00 · 206 阅读 · 0 评论 -
LeetCode 剑指 Offer 34. 二叉树中和为某一值的路径
Description输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,1原创 2020-09-03 15:22:37 · 77 阅读 · 0 评论 -
LeetCode 538. 把二叉搜索树转换为累加树 (中序遍历变形)
Description给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。例如:输入: 原始二叉搜索树: 5 / \ 2 13输出: 转换为累加树: 18 / \ 20 13来源:力扣(LeetCode)链接:h原创 2020-09-02 21:52:12 · 135 阅读 · 0 评论 -
LeetCode 617. 合并二叉树
Description给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2 1 2原创 2020-09-02 21:34:53 · 102 阅读 · 0 评论 -
LeetCode 99. 恢复二叉搜索树
Description二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。示例 1:输入: [1,3,null,null,2] 1 / 3 \ 2输出: [3,1,null,null,2] 3 / 1 \ 2示例 2:输入: [3,1,4,null,null,2] 3 / \1 4 / 2输出: [2,1,4,null,null,3] 2 / \1 4 / 3来源原创 2020-08-08 23:07:42 · 168 阅读 · 0 评论 -
95. 不同的二叉搜索树 II (回溯)
Description给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \原创 2020-07-21 15:57:49 · 190 阅读 · 0 评论 -
LeetCode 297. 二叉树的序列化与反序列化(层次遍历)
Description序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[原创 2020-06-17 22:29:23 · 219 阅读 · 0 评论 -
LeetCode 100. 相同的树
Description给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3]输出: true示例 2:输入: 1 1 / \ 2原创 2020-05-31 22:37:57 · 110 阅读 · 0 评论 -
LeetCode 101. 对称二叉树
Description给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 进阶:你可以运用递归和迭代两种方法解决这个问题吗?来源:力扣(LeetCode)链接:https://leetcode-cn原创 2020-05-31 22:33:53 · 211 阅读 · 0 评论 -
LeetCode 572. 另一个树的子树
Description给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s: 3 / \ 4 5 / \ 1 2给定的树 t: 4 / \ 1 2返回 true,因为 t 与 s 的一...原创 2020-05-07 22:06:18 · 180 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树(中序遍历)
Description给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4 / \ ...原创 2020-05-05 20:36:45 · 277 阅读 · 0 评论 -
LeetCode 199. 二叉树的右视图(两个栈进行层序遍历)
Description给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---来源:...原创 2020-04-22 21:19:45 · 210 阅读 · 0 评论 -
LeetCode 543. 二叉树的直径(非递归后序遍历)
Description给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。示例 :给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点...原创 2020-03-16 20:24:49 · 414 阅读 · 0 评论 -
LeetCode 110. 平衡二叉树(后序遍历)
Description给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,nu...原创 2019-11-09 22:23:46 · 173 阅读 · 0 评论 -
二叉树前、中、后序迭代遍历
前序遍历class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass Solution: def InOrder(self, pRoot, k): node = pRoot ...原创 2019-11-09 21:42:48 · 198 阅读 · 0 评论 -
LeetCode 111. 二叉树的最小深度
Description给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.来源:力扣(LeetCode)链接:https://leet...原创 2019-11-06 16:45:45 · 188 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度
Description给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。来源:力扣(LeetCode)链接:https://lee...原创 2019-11-06 16:37:15 · 155 阅读 · 0 评论 -
LeetCode 113. 路径总和 II
Description给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 ...原创 2019-11-06 14:42:56 · 128 阅读 · 0 评论 -
LeetCode 112. 路径总和
Description给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 ...原创 2019-11-05 17:48:19 · 136 阅读 · 0 评论 -
剑指 offer 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5Solu...原创 2019-08-16 16:43:39 · 91 阅读 · 0 评论 -
LeetCode 103. 二叉树的锯齿形层次遍历(双栈层次遍历)
Description给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层次遍历如下:[ [3], [20,9], [15,7]]Soluti...原创 2019-11-01 14:56:41 · 257 阅读 · 0 评论 -
剑指 offer 重建二叉树(前中序列重建二叉树)
描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。Solutionpre.pop(0)用于弹出pre数组中第一个元素,该元素为重建时的根结点class Solution: def reCo...原创 2019-07-16 17:16:56 · 239 阅读 · 0 评论 -
Leetcode 105. 从前序与中序遍历序列构造二叉树(前中序建二叉树)
Description根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7Solution参考:根据前中序建立二叉树# cla...原创 2019-10-26 19:31:44 · 223 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II(双队列层序遍历)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。Solution使用两个栈保存当前行和下一行要访问的节点。class Solution: def Print(self, pRoot): if pRoot is None: return [] resAns = [] curStack = ...原创 2019-10-24 14:32:09 · 169 阅读 · 0 评论 -
剑指offer 二叉搜索树的第k个结点(中序遍历)
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。Solutionclass Solution: # 返回对应节点TreeNode def KthNode(self, pRoot, k): node = pRoot stack = [] ...原创 2019-10-23 20:17:26 · 361 阅读 · 0 评论 -
剑指offer 平衡二叉树(后序遍历)
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。Solution两个思路。写一个求深度的函数,对每一个节点的左右子树求深度,看左右节点深度差值判断是否是平衡二叉树。时间复杂度O(N^2)。自下而上的判断每个节点的左右子树深度差值判断是否是平衡二叉树。时间复杂度O(N)。下面采用这种方法。class Solution: def IsBalanced_Solution(s...原创 2019-09-16 16:02:25 · 303 阅读 · 0 评论 -
剑指offer 二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。Solutionclass TreeNode: def __init__(self, x): self.val = x self.left = None self.right = Noneclass So...原创 2019-09-16 15:35:56 · 137 阅读 · 0 评论