![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法:二叉树基础
二叉树的基础题
拾牙慧者
会点c++、python;
展开
-
leetcode 538. 把二叉搜索树转换为累加树 思考分析
题目 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。 递归思路 二叉搜索树的中序遍历是一个单调递增的数组,我们要做的就是求出从后到前的累加值: [2,5,13]->[20,18,13] 数组的从后向前累原创 2020-10-31 13:27:18 · 155 阅读 · 0 评论 -
二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)
目录1、leetcode 701. 二叉搜索树中的插入操作1、题目2、递归法3、迭代法 1、leetcode 701. 二叉搜索树中的插入操作 1、题目 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证,新值和原始二叉搜索树中的任意节点值都不同。 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果 。 2、递归法 递归返回值以及参数 返回值为空,因为我们进行的是插入操作,不需要知道插原创 2020-10-30 11:14:12 · 369 阅读 · 0 评论 -
leetcode 235. 二叉搜索树的最近公共祖先 思考分析
目录题目思考迭代法 题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 思考 对于普通二叉树,利用回溯从底向上搜索,遇到一个结点的左子树有p,右子树有q,那么当前结点就是最近公共祖先。 对于有序原创 2020-10-28 10:44:21 · 161 阅读 · 0 评论 -
leetcode 236. 二叉树的最近公共祖先 思考分析
目录题目思考分析改进 本文章代码思路来源于公众号【代码随想录】 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 思考分析 1、自下而上遍历对于此题有极大帮助,而后序遍历的特征便是优先处理叶子结点 2、如何判断一个节点是结点q和结点p的公共祖先: 如果找到一个结点,左子树出现结点p,右子树出现结点q原创 2020-10-27 22:22:39 · 246 阅读 · 1 评论 -
leetcode 501. 二叉搜索树中的众数 思考分析
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: void traversal(TreeNode* cur,u原创 2020-10-27 21:28:46 · 155 阅读 · 0 评论 -
LeetCode 530. 二叉搜索树的最小绝对差 思考分析
目录题目思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值思路2:不用数组,进行优化思路3、回顾迭代法求解 题目 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 思路1:递归遍历得到result数组(单调递增),然后对数组进行前后差分,取最小值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *le原创 2020-10-26 20:31:49 · 175 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树 思考分析
题目 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 1、利用BST性质:中序遍历结果递增 由平衡二叉树的性质可知,若是用中序遍历方法,得到的结果会是递增的。 初次外,如果root的结点为空或者只有1个结点的时候,我们认为它也是一棵二叉搜索树。 以这样的思路写出的递归代码: /** * Definition for a binary tree原创 2020-10-26 19:38:02 · 152 阅读 · 0 评论 -
leetcode 700. 二叉搜索树中的搜索 思考分析
目录题目1、不考虑BST性质,直接递归遍历2、回顾BST性质3、利用BST性质进行遍历4、简单的迭代方法 题目 给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。 1、不考虑BST性质,直接递归遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2020-10-24 21:53:52 · 208 阅读 · 0 评论 -
leetcode 617. 合并二叉树 思考分析
题目 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。 思路1:递归遍历两棵树,构造一棵新的树 1、递归参数以及返回值 返回值:新树的结点 参数:两棵旧树 2、终止条件 两棵旧树的对应的该结点都为NULL 3、逻辑(这里直接贴代码和遇到的问题) 首先将情况分为4类: 如果t1 和t2 都是空结点,那么说明新树的这原创 2020-10-24 19:35:01 · 294 阅读 · 0 评论 -
leetcode 654. 构造最大二叉树 思考分析
题目 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 思路和之前的构造树一样:分成左右区间(子树)递归 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNod原创 2020-10-24 18:36:12 · 171 阅读 · 0 评论 -
leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
目录1、106题目2、参考思路:递归切割数组3、105题目4、同样思路的代码 1、106题目 2、参考思路:递归切割数组 代码参考:公众号:代码随想录 后序数组+中序数组 以 后序数组(左右中)的最后一个元素作为切割点,先切中序数组,根据中序数组反过来再切割后序数组。一层一层切割下去,每次后序数组最后一个元素就是结点元素。 先序数组+中序数组 以 先序数组(中左右)的第一个元素作为切割点,先切中序数组,根据中序数组反过来再切割先序数组。一层一层切割下去,每次先序数组第一个元素就是结点元素。 先序数组+后序原创 2020-10-23 15:38:39 · 200 阅读 · 0 评论 -
LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
目录112. 路径总和题目递归解递归解,其他人的解法迭代解,其他人的解法113. 路径总和 II题目递归解递归解,参考别人的思路 112. 路径总和 题目 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树,以及目标和 sum = 22, 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。 递归解 1、函数参数:当前树的根结点、原创 2020-10-22 16:14:07 · 196 阅读 · 0 评论 -
LeetCode 513. 找树左下角的值 思考分析
题目 给定一个二叉树,在树的最后一行找到最左边的值。 递归解 左下角要满足两个条件: 1、深度最大的叶子结点 2、最左结点:使用前序遍历,优先左边搜索。 1、确定递归函数的参数和返回值 参数:树的根结点,maxlen记录最大深度,maxleftval记录最大深度最左结点的数值。 int maxlen = 0; //全局变量,记录最大深度 int maxleftval; //全局变量 最大深度最左节点的数值 void traversal(TreeNode* root,int leftlen); 2、原创 2020-10-22 13:10:56 · 175 阅读 · 0 评论 -
LeetCode 404. 左叶子之和思考分析
题目 计算给定二叉树的所有左叶子之和。 如果是下面的树,只有一个左叶子结点4 思考分析 由此我们可以得到左叶子结点的定义: cur->left !=NULL && cur->left->left==NULL && cur->left->right==NULL 递归遍历+累积操作 /** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2020-10-21 21:58:42 · 156 阅读 · 1 评论 -
LeetCode 572. 另一个树的子树 思考分析
题目 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 示例 1: 给定的树 s: 示例 2: 给定的树 s: 思路 思路:首先层序遍历s树,如果遇到结点值和t根结点值相同的,开始比较以该结点为根结点的树与t树是否相同。 这里有一些点需要注意: 1、s树中可能有许多结点的值和t根结点值相同,所以我们应该对每次比较的结果做记录,如果有相同则直接返回true,否则必须等所有结点都遍原创 2020-10-21 10:55:55 · 196 阅读 · 0 评论 -
LeetCode 257. 二叉树的所有路径 思考分析
题目 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 输入: 输出: [“1->2->5”, “1->3”] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 思路一:深度递归 void traversal(TreeNode* cur , vector<string>& paths,string path) { if(cur == NULL) return;原创 2020-10-20 13:55:46 · 243 阅读 · 0 评论 -
LeetCode 110. 平衡二叉树思考分析
题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过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 / 4 4 返回 false 。 思路一:递归 ...原创 2020-10-19 22:11:40 · 198 阅读 · 0 评论 -
LeetCode 222. 完全二叉树的节点个数
题目 给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。 若最底层为第 h 层, 则该层包含 1~ 2h 个节点。 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 思路一:层序遍历+计数 /** * Definition for a binary tree node. * struct TreeNode { *原创 2020-10-18 23:44:30 · 196 阅读 · 0 评论 -
LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)
目录104. 二叉树的最大深度559. N叉树的最大深度111. 二叉树的最小深度 之前的笔记中,已经用层序遍历解决过这个问题了 现在试着用深度的解法去求解 104. 二叉树的最大深度 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / 9 20 / 15 7 返回它的最大深度 3 。 **选择深度遍历方式:**由于我们需要返回深度信息,所原创 2020-10-18 13:20:58 · 1107 阅读 · 0 评论 -
LeetCode 101. 对称二叉树 思考分析
题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [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 进阶: 你可以运用递归和迭代两种方法解决这个问题吗? 思路一,超时 层序遍历,然后如果该结点是空结点,往该层子数组中填0,否则填val; 当此层所有结点都被遍历了(包括空结点),观察子数组是否对称。 然后更新queue,如原创 2020-10-17 20:15:35 · 228 阅读 · 0 评论 -
LintCode 375. 克隆二叉树(深复制)
先序遍历+构造二叉树 TreeNode * preorder(TreeNode * root){ if(root==NULL) return NULL; TreeNode * ans; ans=new TreeNode(root->val); if(root->left!=NULL){ ans->left=preorder(root->left); } if(root->right!=NULL){原创 2020-10-17 18:33:52 · 219 阅读 · 0 评论 -
Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)
1、层序法: 层序遍历,然后将同一层的所有结点的左右孩子交换 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public:原创 2020-10-17 14:51:23 · 454 阅读 · 0 评论 -
二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))
本文章为结合leetcode题目以及公众号“代码随想录”的文章所做的笔记! 感觉代码随想录的题目整理真的很好,比自己盲目刷题好很多。 目录1、二叉树小记1、满二叉树与完全二叉树2、二叉搜索树3、平衡二叉搜索树AVL4、二叉树存储方式5、二叉树遍历方式6、二叉树的定义2、二叉树深度优先遍历递归算法书写1、leetcode144题:2、leetcode145题:3、leetcode94题:3、二叉树深度优先遍历迭代算法书写1、先序遍历(迭代法)2、中序遍历(迭代法)3、后序遍历(迭代法)4、二叉树深度优先遍.原创 2020-10-15 13:04:09 · 709 阅读 · 0 评论