二叉树
empty__barrel
这个作者很懒,什么都没留下…
展开
-
108. 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树代码随想录题目:给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。递归思路:创建当前节点,然后调用递归函数,创建左树,创建右树。递归代码:class Solution {private: TreeNode* traversal(vector<int>& nums, int left, in原创 2022-04-17 21:36:44 · 349 阅读 · 0 评论 -
力扣:669修剪二叉搜索树
力扣:669修剪二叉搜索树代码随想录题目:给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。递归思路:①:结束条件:不满足条件分为两种:1:小于low,按题目来说是返回修剪好的根原创 2022-03-17 20:29:05 · 253 阅读 · 0 评论 -
力扣:701.二叉搜索树中的插入操作
力扣:701.二叉搜索树中的插入操作代码随想录题目:给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。递归思路:结束条件:将值插入二叉搜索树:1:val小于当前节点的值,无左孩子,创建节点赋给左孩子。2:val大于当前节点的值,无右孩子,创建节点赋给右原创 2022-03-17 17:15:03 · 324 阅读 · 0 评论 -
力扣:450.删除二叉搜索树中的节点
力扣:450.删除二叉搜索树中的节点代码随想录题目:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。递归思路:①终止条件:即满足问题的情况:找到了节点值为key的节点。此时要删除节点。怎么删除节点:题目是返回二叉搜索树的根节点,此时即把root视为根节点。分为四种情况:1:若只有左节点返回左原创 2022-03-17 16:41:46 · 121 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先
力扣:235. 二叉搜索树的最近公共祖先代码随想录题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]思路:因为是二叉搜索树,而且题目说明一定存在节点,只需要搜查每一个节点,然后判断此节点是否大原创 2022-03-15 16:47:58 · 105 阅读 · 0 评论 -
力扣:236. 二叉树的最近公共祖先
力扣:236. 二叉树的最近公共祖先代码随想录题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”递归方法:分递归是左子树出现节点。根节点,根左子树,根右子树。遍历顺序用后序遍历,此时递归函数名字为查找树中两个指定节点的最近公共祖先。那么就分为了三种情况:当两棵树不在同一棵树上时则左树有一个节原创 2022-03-06 11:42:40 · 261 阅读 · 0 评论 -
力扣:501.二叉搜索树中的众数
力扣:501.二叉搜索树中的众数代码随想录题目:给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。假定 BST 满足如下定义:结点左子树中所含节点的值 小于等于 当前节点的值结点右子树中所含节点的值 大于等于 当前节点的值左子树和右子树都是二叉搜索树方法一:前面有一个题目跟这个思路是一模一样的:如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,原创 2022-03-06 10:51:09 · 466 阅读 · 0 评论 -
力扣:530.二叉搜索树的最小绝对差
力扣:530.二叉搜索树的最小绝对差代码随想录题目:给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。我的开始思路:差值是一个正数,其数值等于两值之差的绝对值。三个节点,两个差值。选取更小的然后记录。这种还是会出问题。因为4与3是挨得最近的不是2与4,排列顺序是432,所以这种方法不行,首先排序然后再算差值,取得最小值。方法一:把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值。class Solution {private:vector原创 2022-03-05 18:56:11 · 325 阅读 · 0 评论 -
力扣:98.验证二叉搜索树
力扣:98.验证二叉搜索树代码随想录题目:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。两个陷阱:①:我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。**所以以上代码的判断逻辑是错误的。②:样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。此时可以初始化比较元素为原创 2022-03-05 18:23:07 · 318 阅读 · 0 评论 -
力扣:700.二叉搜索树中的搜索
力扣:700.二叉搜索树中的搜索代码随想录题目:给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。递归思路:此二叉树是二叉搜索树,是一种特殊树。方法①:分为三种情况:分为根、左子树和右子树、通过二叉搜索树的特性来选定左子树或者右子树。代码:class Solution {public: TreeNode* searchBST(TreeNode*原创 2022-03-05 17:32:02 · 229 阅读 · 0 评论 -
力扣:617.合并二叉树
力扣:617.合并二叉树代码随想录递归思路:一:将两个二叉树覆盖,若两节点覆盖则值为两者相加,否则只为一个值或者为空。二:解题方法如一。三:代码随想录三步走1:返回值:节点。参数:两个根节点。2:跟之前一样,很明显满足问题的情况不明确,构建二叉树。根节点情况,左子树、右子树。3:代码:class Solution {public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { TreeNode*原创 2022-03-05 16:29:04 · 115 阅读 · 0 评论 -
力扣:654.最大二叉树
力扣:654.最大二叉树代码随想录两种方法:①:一:构建二叉树,层序遍历输出二:解法按照一。三:代码随想录三步走1:根节点、左子树、右子树。TreeNode类型,参数为数组。2:很明显满足问题的情况不明确,构建二叉树,按照根节点,左子树,右子树。根的情况分为:根为空,只有根。左子树、右子树:递归即可。代码:TreeNode* constructMaximumBinaryTree(vector<int>& nums) { if(nums.size()原创 2022-03-05 16:07:07 · 475 阅读 · 0 评论 -
力扣:105.从前序与中序遍历序列构造二叉树
class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(inorder.size() == 0) return nullptr; int a = preorder[0]; TreeNode* node = new TreeNode(a); if(inorder.si原创 2022-03-05 10:59:20 · 378 阅读 · 0 评论 -
力扣:106.从中序与后序遍历序列构造二叉树
力扣:106.从中序与后序遍历序列构造二叉树代码随想录题目:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。递归思路:一:通过中序和后序来构建二叉树。二:先序遍历、找到中间节点,然后分为左树、右树、通过根节点递归构建。三:代码随想录三步走1:很明显没有思路,就按2的根、左子树、右子树。然后思考返回值就是节点。通过中序数组、后序数组来构造,可以直接用题目给定的函数形式原创 2022-03-04 21:08:22 · 557 阅读 · 0 评论 -
力扣:113. 路径总和ii
力扣:113. 路径总和ii代码随想录题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。思考方法:一:找出所有路径二:当前路径vector、存储路径vector<vector>、一个值来存储当前路径值sum参数、三:1:返回值void类型,传入根节点,路径值、标准值、当前路径、存储路径2:写主体代码。找到了叶子结点且路径值等于标准值。3:先序遍历、然后分为根原创 2022-03-03 17:49:35 · 192 阅读 · 0 评论 -
力扣:112. 路径总和
力扣:112. 路径总和代码随想录题目:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。思考方法:一:是否存在根节点到叶子节点的路径,所有节点值相加等于标准值。二:先序遍历、用参数记录路径值。三:代码随想录三步走1:返回值bool类型,传入根节点,路径值、标准值。2:写主体原创 2022-03-03 17:13:14 · 175 阅读 · 0 评论 -
力扣:513.找树左下角的值
递归方法:左叶子节点,同时记录深度。比较深度,深的赋给 result 即可迭代方法:层序遍历,最后一层第一个元素即是。将每一层第一个元素入栈,最后出栈顶即是。原创 2022-03-03 16:37:16 · 164 阅读 · 0 评论 -
力扣:404.左叶子之和
力扣:404.左叶子之和代码随想录如果左节点不为空,且左节点没有左右孩子,那么这个节点就是左叶子。题目:给定二叉树的根节点 root ,返回所有左叶子之和。代码:先序遍历每一个节点同时判断每一个节点的左孩子是不是左叶子。a用全局变量。即在遍历节点的同时顺便解题。class Solution {public:int a = 0; int sumOfLeftLeaves(TreeNode* root) { if(!root) return a; if(原创 2022-03-02 13:31:03 · 137 阅读 · 0 评论 -
力扣:100.相同的树、力扣:572.另一个树的子树
题目①:力扣:100.相同的树题目:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。递归代码:判断每个节点是否相等class Solution {public: bool compare(TreeNode*q, TreeNode*w){ if(!q && !w) return true; else if(q && !w) retu原创 2022-03-02 13:05:25 · 101 阅读 · 0 评论 -
力扣:二叉树的所有路径
前中后遍历方法都能够遍历所有可能的路径。题目:给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。思路:前中后遍历方法都能够遍历所有可能的路径。要遍历节点的时候要用一个容器存储路径,当达到可行的时候要,把路径输出,当不可行,要回退、同时还要出容器中的元素。思考情况:然后对应写代码。...原创 2022-03-01 22:03:59 · 180 阅读 · 0 评论 -
力扣:110.平衡二叉树
力扣:110.平衡二叉树代码随想录题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:递归思路:这个题目不是很好理解的主体:在求高度的同时把问题顺便解决。这个递归函数名为:求高度解法:1+左孩子高度+右孩子高度顺便的操作:假如左孩子高度与右孩子高度之差大于1那么返回-1。顺便把问题解决这很巧妙,也不是这样说确切来说是:看似是次体又是主体,应该说两者都是主体。解决问题是体现了求高度为主体,在大体上来看以及在过程中来看又体现了是否为平衡二叉树为主体。做题原创 2022-03-01 16:33:21 · 247 阅读 · 0 评论 -
力扣:222.完全二叉树的节点个数
力扣:222.完全二叉树的节点个数方法①②是普通二叉树(通用)求法,方法③是完全二叉树的求法。题目:给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。递归法思路:根为空,则为0;根不为空,节点个数等于1+左右子树节点个数。代码:class Solution {public:原创 2022-03-01 15:56:02 · 106 阅读 · 0 评论 -
力扣:111.二叉树的最小深度
力扣:111.二叉树的最小深度题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。递归法思路:如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1。代码:class Solution {public: int minDepth(TreeNode* root) { if(!root) ret原创 2022-03-01 15:31:36 · 100 阅读 · 0 评论 -
力扣:101. 对称二叉树
力扣:101. 对称二叉树代码随想录题目:给你一个二叉树的根节点 root , 检查它是否轴对称。思路:①递归:遍历左右子树。左边左右中,右边右左中。假如两个容器相等则对称。1:确定递归函数的参数和返回值:2:确定终止条件:即写出return的情况3:确定单层递归:有递归的情况,这也是一种情况也要返回值。 m每种情况都要返回值。这个递归函数的名字叫做:比较对应节点是否相等。一层一层往下走,先把外面全部比较完然后比较里面,最后取交集看树是否对称。左节点为空,右节点不为空,不对称,r原创 2022-02-27 21:08:30 · 7541 阅读 · 0 评论 -
力扣:二叉树的深度、力扣:559.n叉树的最大深度
力扣:二叉树的深度代码随想录题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。法①递归:根为空则深度为0;跟不为空,深度等于1+左右子树深度的最大值代码:class solution {public: int maxdepth(treenode* root) { if (root == null) return 0; return 1 + max(maxdepth(原创 2022-03-01 15:16:02 · 138 阅读 · 0 评论 -
力扣:226.翻转二叉树
力扣:226.反转二叉树代码随想录题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。思路:遍历到每一个节点,遍历到的时候就交换其左右孩子。遍历方式我这写了四种所以就有四种方法。代码:介绍四种方法:①:递归法思路:首先递归三部曲:1:确定递归函数的参数和返回值TreeNode* invertTree(TreeNode* root)2:确定终止条件if (root == NULL) return root;3:确定单层递归的逻辑swap(root-&原创 2022-02-25 07:49:40 · 174 阅读 · 0 评论 -
力扣:111.二叉树的最小深度
力扣:111.二叉树的最小深度代码随想录解析题目:给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。思路:最小深度:从上到下从左到右依次遍历遇到的第一个没有孩子节点的一行。从上到下依次每行遍历,记录行数,当出现某一行某一节点的孩子为空,那么直接返回行数。代码:class Solution {public: int minDepth(TreeNode* root) { queue<Tr原创 2022-02-24 17:11:32 · 220 阅读 · 0 评论 -
力扣:104.二叉树的最大深度
力扣:104.二叉树的最大深度代码随想录解析题目:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。思路:按层序遍历,同时记录层数。代码:class Solution {public: int maxDepth(TreeNode* root) { queue<TreeNode*>que; if(root!=nullptr) que.push(root);原创 2022-02-24 16:56:28 · 87 阅读 · 0 评论 -
力扣:117.填充每个节点的下一个右侧节点指针II
力扣:117.填充每个节点的下一个右侧节点指针II代码随想录题目:给定一个二叉树struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。思路:这一题的代码①与上一题的②代码完全一样。当前行的最后一个前面的节点都有next,所以当 i < si原创 2022-02-24 16:46:42 · 5793 阅读 · 0 评论 -
力扣:116.填充每个节点的下一个右侧节点指针
力扣:116.填充每个节点的下一个右侧节点指针代码随想录解析题目:给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node {int val;Node *left;Node *right;Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。①思路:对当前行取出的元素进行链接。原创 2022-02-24 15:48:53 · 114 阅读 · 0 评论 -
力扣:515.在每个树行中找最大值
力扣:515.在每个树行中找最大值代码随想录题目:给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。思路:正常按层序遍历,for中内容,是从第一层一直到最后一层,首相将第一个元素值赋给标志量,然后后面这一行要删除的元素的值都与这个标志量进行比较,后面的值大则交换。代码:class Solution {public: vector<int> largestValues(TreeNode* root) { queue<TreeNode*原创 2022-02-24 15:23:02 · 79 阅读 · 0 评论 -
力扣:429.N叉树的层序遍历
力扣:429.N叉树的层序遍历代码随想录解析题目:给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。思路:这个题目也是按层序遍历,只是一个节点可能有多个孩子,节点孩子的形式不再是left,right 而是 vector 来储存所有孩子。依旧是之前按层序遍历的方式,只不过在添加下一行的时候,是添加 当前节点的vector 里面的元素。代码:class Solution {public: ve原创 2022-02-24 15:04:39 · 5305 阅读 · 0 评论 -
力扣:637.二叉树的层平均值
力扣:637.二叉树的层平均值代码随想录解析题目:给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。思路:按层序遍历,用sum记录每一层的加和值,每一层结束取平均值放入 vector 中。代码:class Solution {public: vector<double> averageOfLevels(TreeNode* root) { queue<TreeNode*>原创 2022-02-24 14:29:51 · 98 阅读 · 0 评论 -
力扣:199.二叉树的右视图
力扣:199.二叉树的右视图代码随想录解析题目:给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。思路:按层序遍历,当要出队列的元素是每一行的最后一个元素时,元素值入 vector 中。代码:class Solution {public: vector<int> rightSideView(TreeNode* root) { queue<TreeNode*>que; i原创 2022-02-24 14:18:10 · 214 阅读 · 0 评论 -
力扣:107.二叉树的层次遍历 II
力扣:107.二叉树的层次遍历 II代码随想录解析题目:给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)思路:按层序遍历然后翻转 vector 容器即可。代码:class Solution {public: vector<vector<int>> levelOrderBottom(TreeNode* root) { queue<TreeNode*>que原创 2022-02-24 14:09:09 · 77 阅读 · 0 评论 -
力扣:102.二叉树的层序遍历
力扣:102.二叉树的层序遍历代码随想录解析题目:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。思路:入每一行的节点,然后首先出一行的头结点同时将其元素值放入vector中,同时入其左孩子右孩子,就这样依次出依次入,到最后上一行全部出去,下一行全部进来。先进先出所以选择队列。返回的结果:容器中每一个元素代表的都是一行的元素值。所以每一次的操作都是操作一行,将一行的数值全部放入vector中然后再将此vector放入总vector中。代码:c原创 2022-02-24 13:58:44 · 610 阅读 · 0 评论 -
将前中后序迭代法遍历整合成一种类似的代码
无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。分为两部分:存储元素:右中左,出栈然后右中左然后一直这样,此时就是把左边的全部处理完(即先处理左树)。回收元素:左边到顶了下一个为null了就回收元素,然后节点到中节点,此时也不进行右中左,节点到右节点时,此时继续进行右中左,右中左。(即将右节点当做根节点处理右树)。解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况:从栈中取元素作为根节点,然后根据不同类型的跟节点进行不同的操作。对左节点的操作以及对右节原创 2022-02-23 21:17:42 · 141 阅读 · 0 评论 -
前中后序遍历(递归法和迭代法)
1:确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2:确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。3:确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。...原创 2022-02-23 20:37:23 · 1263 阅读 · 0 评论 -
二叉树基础知识
代码随想录解析一:二叉树的种类1:满二叉树2:完全二叉树3:二叉搜索树:左孩子、根、右孩子权值依次增加。4:平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树。具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,unordered_set、unordered_map底层实现是哈希表。二:二叉树的存储方式(二叉树可以链原创 2022-02-22 21:29:25 · 449 阅读 · 0 评论