二叉树
Lc_summer
这个作者很懒,什么都没留下…
展开
-
求完全二叉树中的最近公共祖先(数组形式存放节点)
完全二叉树的最近公共祖先题目描述完全二叉树采用数组存放,在数组中找到v1和v2的最近公共祖先思路将数组的索引当做二叉树的节点,当前节点为root,其左子树为left = root * 2 + 1;右子树为 right = left + 1;,递归三部曲返回值和参数:输入当前的数组以及起始点root = 0,两个节点值v1和v2,输出v1和v2的最近公共祖先单层递归逻辑:当前节点等于v1或者v2时返回当前节点,当前节点不为v1或者v2,遍历它的左子树和右子树,如果左子树返回-1,说明v1和v2原创 2021-03-29 21:23:19 · 1470 阅读 · 0 评论 -
把二叉树转换为累加树
leetcode 538. 把二叉搜索树转换为累加树给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。递归三部曲1.参数和返回值: 输入树的根节点,返回累加后树的根节点2.单层递归逻辑:从右到左中序遍历,数组原创 2021-03-04 09:34:19 · 219 阅读 · 0 评论 -
将有序数组转换为二叉搜索树
leetcode 108. 将有序数组转换为二叉搜索树题目链接递归三部曲1.参数和返回值:输入有序数组和它的范围,输出构建的二叉树2.单层递归逻辑:当前节点为数组中的中位数,左子树在中位数的左边,右子树在中位数的右边3.终止条件:当数组大小为0时退出class Solution { TreeNode* buildTree(vector<int>& nums, int begin, int end) { if(begin == end)原创 2021-03-04 09:34:01 · 157 阅读 · 0 评论 -
修建二叉树
leetcode 669. 修剪二叉搜索树题目链接递归三部曲1.参数和返回值:输入树的根节点和范围值,返回修剪后的树的根节点2.单层递归逻辑:判断当前根节点是否在范围内,大于范围新的根节点就在左子树,反之则在右子树;当根节点在范围内,则遍历它的左右子树3.终止条件:节点为空; TreeNode* trimBST(TreeNode* root, int low, int high) { if(root == nullptr) return nullpt原创 2021-03-04 09:33:42 · 173 阅读 · 0 评论 -
删除二叉搜索树的节点
leetcode 450.删除二叉搜索树中的节点题目链接给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明:要求算法时间复杂度为 O(h),h 为树的高度。示例:递归三部曲1.返回值和参数:输入根节点和删除的节点值,返回删除后的根节点2.单层递归逻辑:找到删除的点,然后将其左子树放在其右子树原创 2021-03-04 09:33:24 · 236 阅读 · 0 评论 -
二叉搜索树的插入(递归+迭代)
leetcode 701. 二叉搜索树中的插入操作递归三部曲1.返回值和参数:输入根节点 和插入值val,输出插入后的根节点2.单层递归逻辑:val比当前值大则插入在其右子树,否则插入在其左子树3.终止条件:当前节点为空,则val插入在这里返回 TreeNode* insertIntoBST(TreeNode* root, int val) { if(root == nullptr) return new TreeNode(val);原创 2021-03-04 09:33:00 · 783 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
leetcode 235. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] TreeNode* lowestCommonAncestor(TreeNode* root,原创 2021-03-04 09:31:59 · 125 阅读 · 0 评论 -
求二叉搜索树中的众数
leetcode 501. 二叉搜索树中的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2],返回[2].提示:如果众数超过1个,不需考虑输出顺序进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)思路将中序遍历看成一个有序数组原创 2021-03-04 09:29:14 · 157 阅读 · 0 评论 -
合并两个二叉树
leetcode 617.合并二叉树给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。注意: 合并必须从两个树的根节点开始。递归三部曲1.参数和返回值:输入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。2.单层递归逻辑:两个数的节点值之和赋值给其中一个节点,然后当前节点的左子树为两个树左子树之和,原创 2021-03-03 10:47:28 · 275 阅读 · 0 评论 -
利用数组构建最大二叉树(根节点大于左右子树)
leetcode 654. 最大二叉树给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。递归三部曲1.参数和返回值:数组 vector< int >以及他的起始点 int;输出树的根节点2.单层递归逻辑:找数组最大的值为当前根节点原创 2021-03-03 10:46:04 · 689 阅读 · 0 评论 -
构建二叉树(前序+中序,中序+后序)
leetcode 105. 从前序与中序遍历序列构造二叉树递归三部曲1.返回值和参数:输出前序和中序的 vector< int > 和起止索引 int,输出树的根节点2.单层递归逻辑:前序和中序只有一个元素,返回,否则在中序中找到前序的首位元素,在将中序按次元素划分为两个部分,当前节点的左子树根据划分的左边部分得到,右子树根据右边部分得到3.终止条件:当前数组为1返回当前节点,为0返回 空class Solution { unordered_map<int, int>原创 2021-03-03 10:45:15 · 259 阅读 · 0 评论 -
求二叉树中所有和为target的路径
leetcode 113. 路径总和 II给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[[5,4,11,2],[5,8,4,5]]递归三部曲1原创 2021-03-03 10:44:21 · 766 阅读 · 0 评论 -
判断二叉树是否存在路径和为target
leetcode 112. 路径总和给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true示例 2:输入:root = [1,2,3], targetSum = 5输出:fals原创 2021-03-03 10:43:38 · 615 阅读 · 0 评论 -
找树最左侧的值(迭代+递归)
leetcode 513. 找树左下角的值给定一个二叉树,在树的最后一行找到最左边的值。示例 1:输入:2/ 1 3输出:1示例 2:输入: 1 / \ 2 3 / / \4 5 6 / 7输出:7迭代思路利用队列每次保存一层的节点,利用一个value记录当前层的最左边的节点值,层序遍历,每次更新value为当前层的最左侧的值,当队列为空时,value为最后一层的最左的值 int findBottomLeftValu原创 2021-03-03 10:42:40 · 266 阅读 · 0 评论 -
二叉树的所有左叶子节点之和
leetcode 404. 左叶子之和计算给定二叉树的所有左叶子之和。示例:3/ 9 20/ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24递归三部曲参数和返回值:返回值为左叶子点之和 int单层逻辑:当前节点的左叶子点 + 当前节点的左右子树的左叶子点之和终止条件: 当前节点为空;(这里当前节点的左孩子为叶子节点就没必要继续判断它的左孩子了,可以节省一步) int count = 0; int sumOfLeftLeaves(T原创 2021-03-03 10:41:36 · 1313 阅读 · 0 评论 -
判断一个树是否是另一个树的子树
leetcode 572. 另一个树的子树给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。示例 1:给定的树 s:3/ 4 5/ 1 2给定的树 t:4/ 1 2返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。示例 2:给定的树 s:3/ 4 5/ 1 2/0给定的树 t:4/ 1 2原创 2021-03-03 10:40:56 · 273 阅读 · 0 评论 -
求二叉树的所有路径
leetcode 257.二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入:1/ 2 35输出: [“1->2->5”, “1->3”]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3递归参数和返回值:树的节点 TreeNode*,返回值 void,路径用全局变量保存单层逻辑:判断当前节点是否为叶子节点,是叶子节点则当前路径 + 当前的叶子节点作为一条原创 2021-03-03 10:39:55 · 393 阅读 · 0 评论 -
判断平衡二叉树
leetcode 110. 平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。输入:root = [3,9,20,null,null,15,7]输出:true输入:root = [1,2,2,3,3,null,null,4,4]输出:false递归参数和返回值:树的一个节点 TreeNode*, 返回当前树的深度递归的单层逻辑:当前节点的左右子树高度差不大于1,返回当前节点为根的高度原创 2021-03-03 10:36:36 · 111 阅读 · 0 评论 -
求二叉树的最大深度(递归和迭代)
leetcode 104. 二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。递归参数和返回值:参数为树的节点,返回值为当前节点的深度单层的逻辑:左子树和右子树高度中的最大值加1(当前节点)终止条件:当前节点为空,返回其高度为0;int maxDepth(Tree原创 2021-03-04 09:27:53 · 321 阅读 · 0 评论 -
求二叉树的最小深度(迭代和递归)
leetcode 111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2递归参数和返回值:参数为树的节点 TreeNode*,返回值 int ;单层递归逻辑:当前节点左右子树都不为空则,最小深度等于其左右子树深度中最小的那个 + 1,有一个为空则最小深度等于不为空的子树深度 + 1,终止条件:当前节点为空返回原创 2021-03-02 17:40:01 · 279 阅读 · 0 评论 -
判断二叉树是否对称(迭代和递归解法)
leetcode 剑指 Offer 28. 对称的二叉树请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [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示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2原创 2021-03-02 17:38:54 · 791 阅读 · 0 评论 -
五种方式反转二叉树(前序递归和迭代反转,后序递归和迭代反转,层序反转)
leetcode 226 反转二叉树翻转一棵二叉树。示例:输入:4/ 2 7/ \ / 1 3 6 9输出:4/ 7 2/ \ / 9 6 3 1五种方式实现二叉树的反转遍历的过程中对只访问一次节点的方式都可以,中序遍历节点反转了两次不能用前序递归递归函数的返回值:二叉树的根节点递归函数的参数:二叉树的当前节点递归函数的函数体:当前节点不为空则互换它的左右子树,反转左子树,反转右子树递归函数的终止添加:当前节点为空则退原创 2021-03-02 17:37:02 · 1156 阅读 · 0 评论 -
利用队列求二叉树每层的平均值
leetcode 637. 二叉树的层平均值给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例 1:输入:3/ 9 20/ 15 7输出:[3, 14.5, 11]解释:第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。 struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNo原创 2021-03-02 17:35:36 · 154 阅读 · 0 评论 -
利用队列求解N叉树的层序遍历
leetcode 429. N 叉树的层序遍历给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]class Node {public: int val; vector<Node*> children; Node() {} Node(i原创 2021-03-02 17:34:33 · 186 阅读 · 0 评论 -
利于队列求二叉树的右视图
leetcode 199. 二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ 2 3 <—\ 5 4 <—思路利用一个队列每次保存二叉树一层的节点,从右到左存,队首元素即右视图在在前层可见的节点 struct TreeNode {原创 2021-03-02 17:33:26 · 154 阅读 · 0 评论 -
利用队列进行二叉树的层序遍历
leetcode 102. 二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层序遍历结果:[[3],[9,20],[15,7]]思路利用一个队列每次保存一层的节点,然后再遍历该层节点的时候将其非空的左右孩子加入队列,最后队列为空则层序遍历完成struct TreeNode { int val;原创 2021-03-02 17:31:26 · 727 阅读 · 0 评论 -
二叉树前序遍历递归和迭代解法
leetcode 144.二叉树的前序遍历给你二叉树的根节点 root ,返回它节点值的 前序 遍历。struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}原创 2021-03-02 17:30:11 · 153 阅读 · 0 评论 -
二叉树的中序遍历递归和迭代解法
leetcode94. 二叉树的中序遍历给定一个二叉树的根节点 root ,返回它的中序遍历。struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} Tree原创 2021-03-02 17:25:09 · 235 阅读 · 0 评论