
二叉树
文章平均质量分 53
二叉树
alone_yue
后端开发 算法 爱好健身打球游泳
展开
-
【Leetcode二叉树--最大路径和】124.二叉树中的最大路径和
1.思想首先得是后序遍历,根节点拿到左右子树的最大路径和,才能判断当前路径和>2.max = Math.max(max, root.val+leftSum+rightSum) 维护一个最大值就是两边子树,从根节点到某个节点最大值加起来,也就是经过根节点的最大值,也就是左子树的某个节点到右子树的某个节点经过根节点的最大值>3.sum += Math.max(leftSum, rightSum) sum就是从根节点到左右子树的某个节点的最大值,其实是根到子节点...原创 2022-07-11 21:57:51 · 1454 阅读 · 0 评论 -
【Leetcode二叉树】662. 二叉树最大宽度(利用父子节点pos关系求宽度,非常好的思路)
文章目录Leetcode6621.问题描述2.解决方案整体思路:解法一:用beginPos维护pos进而求宽度解法二:用ArrayList维护pos进而求宽度Leetcode6621.问题描述2.解决方案整体思路:1.这个给每个节点一个pos值,进而封装一层的思想非常优秀2.既能使用到pos值,又不用使用静态数组存储节点3.即为左右指针存储树,还能使用到静态数组的特性解法一:用beginPos维护pos进而求宽度1.思路就是每一层的第一个节点为beginPos,后面的节点都原创 2021-12-02 10:25:06 · 779 阅读 · 0 评论 -
【Leetcode二叉搜索树的修改与构造二】450. 删除二叉搜索树中的节点
文章目录Leetcode4501.问题描述2.解决方案Leetcode4501.问题描述2.解决方案原创 2021-10-06 20:59:46 · 74 阅读 · 1 评论 -
【Leetcode二叉搜索树的修改与构造一】701. 二叉搜索树中的插入操作(有清晰的画图解析复杂递归过程,关于递归返回值的解法解析,二叉搜索树不回溯的理解!!!)
文章目录Leetcode7011.问题描述2.解决方案解法一:有返回值递归解法二:无返回值递归解法三:迭代Leetcode7011.问题描述2.解决方案解法一:有返回值递归1.递归因为是二叉搜索树自然不需要全树遍历,只需要根据大小确定递归方向这个很好理解2.但是说实话这个递归过程的话,需要理解一下,其实我们之前的二叉树递归都不需要创造新的结点自然也不需要结点与结点之间的赋值,但是这个需要把插入的节点赋给其父亲节点,所以就出现了这样的递归过程//if(val>root->val原创 2021-10-06 20:35:20 · 96 阅读 · 1 评论 -
【Leetcode二叉树的公共祖先问题四】235. 二叉搜索树的最近公共祖先(有关于二叉搜索树做题的一些经验!!!)
文章目录Leetcode2351.问题描述2.解决方案解法一:递归解法二:迭代Leetcode2351.问题描述2.解决方案解法一:递归以后但凡遇见二叉搜索树就要想递归绝对不是回溯递归,因为天生有序,但是这道题应该如何运用呢,我们自然而然的应该剖析最近公共祖先和两个节点的大小关系,然后意识到是区间内的关系,那么递归顺序就出来了!1.如果大于两个结点就去左子树找2.如果小于两个结点就去右子树找3.除了这两种情况那不就是在区间内了嘛,直接返回当前结点rootclass Solution原创 2021-10-06 19:06:13 · 72 阅读 · 1 评论 -
【Leetcode二叉树的公共祖先问题三】 236. 二叉树的最近公共祖先(万能解法,递归函数返回值的深度理解!!!!!!)
文章目录Leetcode2361.问题描述2.解决方案解法一:万能解法解法二:深度剖析回溯万能解法1.本题关于递归返回值的思考!!!!!2.思路:3.关于递归函数的深度解析:4.代码:Leetcode2361.问题描述2.解决方案解法一:万能解法万能解法面试题04.08.首个共同祖先//万能解法class Solution4 {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode原创 2021-10-06 11:33:59 · 136 阅读 · 1 评论 -
【Leetcode二叉树的公共祖先问题二】程序员面试金典-面试题04.08.首个共同祖先
文章目录面试题04.081.问题描述2.解决方案解法一:不包含父亲节点的双递归低效解法解法二:不包含父亲节点的单递归最优化解法(万能解法另一篇博客有介绍)解法三:深度优先遍历搜索 递归遍历整棵二叉树(力扣官方题解)面试题04.081.问题描述2.解决方案解法一:不包含父亲节点的双递归低效解法//不包含父亲节点的双递归低效解法class Solution1 {public: //判断p节点是否在以root为根节点的树中 bool covers(TreeNode* root,原创 2021-10-06 10:21:45 · 196 阅读 · 1 评论 -
【Leetcode二叉树的公共祖先问题一】祖先类的模板题目 剑指 Offer 68 - II. 二叉树的最近公共祖先 面试题 04.08. 首个共同祖先 1123.865. 最深叶节点的最近公共祖先
文章目录万能解法模板(程序员面试金典有解释哦)!!!!!!!!剑指 Offer 68 - II. 二叉树的最近公共祖先1.问题描述2.解决方案面试题 04.08. 首个共同祖先1.问题描述2.解决方案1123. 最深叶节点的最近公共祖先1.问题描述2.解决方案万能解法模板(程序员面试金典有解释哦)!!!!!!!!分为五个步骤1.必要的检查2.可以理解为对于要寻找的节点的判断(每个题变化的部分就是在于对节点的判断!!)3.递归调用等待结果4.根据上面的left,right 空和不空组成的四种结果原创 2021-10-06 10:14:06 · 199 阅读 · 1 评论 -
【Leetcode二叉搜索树的属性四】501.二叉搜索树中的众数 451.根据字符出现频率排序(包含很多代码的实现技巧)
文章目录Leetcode5011.问题描述2.解决方案Leetcode5011.问题描述2.解决方案原创 2021-10-05 16:13:15 · 171 阅读 · 1 评论 -
【Leetcode二叉搜索树的属性三】530. 二叉搜索树的最小绝对差(二叉搜索树的中序递归的经典记录preNode操作,二叉搜索树的经典转化思路看过来!!)
文章目录Leetcode5301.问题描述2.解决方案二叉树问题总结:解法一:中序遍历解法二:中序遍历递归解法二:迭代Leetcode5301.问题描述2.解决方案二叉树问题总结:遇到二叉搜索树上求最值差值之类的,就等价于在一个有序数组上求最值,求差值,这样问题就简单多了!!解法一:中序遍历思路很直接就是把中序找出来,遍历一遍!class Solution {public: vector<int> inorder; void tran(TreeNod原创 2021-10-05 16:01:51 · 186 阅读 · 1 评论 -
【Leetcode二叉搜索树的属性二】98. 验证二叉搜索树(把递归的代码实现的思路和遍历的顺序描述的很清楚,建议回来多看!!!)
文章目录Leetcode981.问题描述2.解决方案注意点:本题也是二叉搜索树容易犯的两个错误解法一:强行递归解法二:中序遍历递增解法三:中序遍历递归解法四:迭代法Leetcode981.问题描述2.解决方案注意点:本题也是二叉搜索树容易犯的两个错误解法一:强行递归二叉搜索树要求左子树所有结点必须小于根节点,右子树所有结点必须大于根节点那么我的思路,遍历每一个结点,对于每一个结点我都判断这个结点的左右子树是否符合规则1.judgeSmall和judgeBig和isValidBST原创 2021-10-05 15:38:53 · 97 阅读 · 1 评论 -
【Leetcode二叉搜索树的属性一】700. 二叉搜索树中的搜索
文章目录Leetcode7001.问题描述2.解决方案解法一:递归解法二:迭代Leetcode7001.问题描述2.解决方案解法一:递归思路很简单没什么好说的,就是搜索找到了就比较1.递归出口确定好2.由于是找到了就直接返回,所以不需要搜索完全树,所以递归函数有返回值,这个前面已经清楚的讨论过了有关于递归函数返回值的讨论3.根据大小关系进行左右子树递归class Solution {public: TreeNode* searchBST(TreeNode* root, in原创 2021-10-05 14:06:45 · 122 阅读 · 1 评论 -
【Leetcode二叉搜索树的属性一】普通二叉树和二叉搜索树在迭代法上面的区别
区别就在于,普通二叉树在迭代的过程中有回溯的过程,也就是有调头回去重走的过程,而二叉搜索树不会,它搜索的方向是一定的!原创 2021-10-05 13:50:52 · 132 阅读 · 0 评论 -
【Leetcode二叉树的修改与构造三】617. 合并二叉树
文章目录Leetcode6171.问题描述2.解决方案解法一:递归解法二:迭代Leetcode6171.问题描述2.解决方案解法一:递归这个思路很简单没什么好说的,就是递归处理两棵树的左右子树1.首先我都不用管题目,参数有两个指针应该怎么处理不用我多说了吧,两个指针总共四种情况,空不空,不空空,空空,不空不空,都列出来分别处理,那要是带到题目分析那也和简单就是一个空了那直接返回另一个不就是合并了if(root1== nullptr&&root2== nullptr) ret原创 2021-10-05 11:26:36 · 100 阅读 · 1 评论 -
【Leetcode二叉树的修改与构造二】654. 最大二叉树
文章目录Leetcode6541.问题描述2.解决方案Leetcode6541.问题描述2.解决方案思路可以说很简单,就递归每次找最大,然后递归左右子树,这里强调几点1.当然需要必要的检查,相信参数中有一个区间的首尾值的检查应该熟记于心了if(start>end) return nullptr;2.找到最大值下标后就直接递归左右子树了root->left= build(nums,start,index-1); root->right= build(nums,i原创 2021-10-05 11:06:21 · 93 阅读 · 1 评论 -
【Leetcode二叉树的修改与构造一】105.106.的思考题,前序和后序不能唯一确定一颗二叉树
原创 2021-10-05 10:50:30 · 101 阅读 · 0 评论 -
【Leetcode二叉树的修改与构造一】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树
文章目录Leetcode1051.问题描述2.解决方案解法一:递归思路代码实现解法二:递归优化---思路---经验---代码实现a.错误写法b.正确写法解法三:迭代(我还没看)Leetcode1061.问题描述2.解决方案Leetcode1051.问题描述2.解决方案解法一:递归思路基本思路:1.找到根在中序的位置,进而构造左右子树的前中序列,然后递归,然后返回根即可2.当然需要进行很必要的检查!if(preorder.size()==0||inorder.size()==0)原创 2021-10-05 09:25:50 · 358 阅读 · 1 评论 -
【Leetcode二叉树属性九】112. 路径总和 113. 路径总和 II (有关于递归函数返回值的讨论)
文章目录Leetcode1121.问题描述2.解决方案Leetcode1131.问题描述2.解决方案Leetcode1121.问题描述2.解决方案class Solution {public: bool backtracking(TreeNode* root,int targetSum,int curSum){ if(root== nullptr) return false; if(root->left== nullptr&&r原创 2021-10-04 20:02:55 · 206 阅读 · 2 评论 -
【Leetcode二叉树属性八】513. 找树左下角的值
文章目录Leetcode5131.问题描述2.解决方案解法一:迭代层序遍历解法二:迭代层序遍历解法三:递归Leetcode5131.问题描述2.解决方案解法一:迭代层序遍历思路很简单就是层序遍历,然后记录最后一层,返回最后一层第一个结点的值那么重点就是如何优雅的记录最后一层1.首先要记录一个拷贝构造的一个初始化queue的方式queue<TreeNode*> preQueue(q),这个相当于记录了前一层的结点2.如果当前层为空那自然前一层就是最后一层,直接返回第一个结点的原创 2021-10-04 17:22:03 · 289 阅读 · 1 评论 -
【Leetcode二叉树属性七】404. 左叶子之和
文章目录Leetcode4041.问题描述2.解决方案解法一:递归父亲节点思路:代码:解法二:递归解法三:迭代Leetcode4041.问题描述2.解决方案解法一:递归父亲节点思路:思路很简单,就是遍历然后如果遇见符合条件的左叶子结点就收集1.首先是左叶子结点这个怎么判断,我将一个父亲结点加入到了递归函数的参数中,所以就很好判断root是左儿子还是右儿子了2.这两个判断条件或者是终止条件这是我一开始没有想到的,father= =nullpter了说明root就是根节点嘛,但是不加这个判断原创 2021-10-04 16:33:58 · 107 阅读 · 1 评论 -
【Leetcode二叉树的遍历】求二叉树深度高度等的二叉树的遍历方式的讨论(未完)
稍后做解释原创 2021-10-04 11:28:08 · 148 阅读 · 1 评论 -
【Leetcode二叉树属性六】257. 二叉树的所有路径
文章目录Leetcode2571.问题描述2.解决方案Leetcode2571.问题描述2.解决方案class Solution {public: vector<string> ans; //string path; void backtracking(TreeNode* root,string path){ if(root== nullptr){ //ans.push_back(string(path.begin(),原创 2021-10-04 10:42:19 · 98 阅读 · 1 评论 -
【Leetcode二叉树属性五】110. 平衡二叉树 程序员面试金典-面试题04.04.检查平衡性
文章目录Leetcode1101.问题描述2.解决方案Leetcode1101.问题描述2.解决方案class Solution {public: int getHeight(TreeNode* root){ if(root== nullptr) return 0; return max(getHeight(root->left), getHeight(root->right))+1; } bool isBalanced(Tre原创 2021-10-03 17:34:41 · 286 阅读 · 1 评论 -
【Leetcode二叉树属性四】222. 完全二叉树的节点个数
文章目录Leetcode2221.问题描述2.解决方案解法一:普通二叉树递归解法二:普通二叉树迭代解法三:利用完全二叉树性质递归思路:代码实现:Leetcode2221.问题描述2.解决方案解法一:普通二叉树递归就左右子树加起来再加一class Solution {public: int countNodes(TreeNode* root) { if(root== nullptr) return 0; return 1+ countNodes(原创 2021-10-03 17:21:36 · 118 阅读 · 1 评论 -
【Leetcode二叉树属性三】111. 二叉树的最小深度
文章目录Leetcode1111.问题描述2.解决方案解法一:递归解法二:迭代Leetcode1111.问题描述2.解决方案解法一:递归这个要好好分析出来,不是一下子就能出来的,和求二叉树最大深度的题还是有很大区别的!class Solution {public: int minDepth(TreeNode* root) { if(root== nullptr) return 0; if(root->left!= nullptr&原创 2021-10-03 16:02:54 · 80 阅读 · 1 评论 -
【Leetcode二叉树属性二】104. 二叉树的最大深度 559. N 叉树的最大深度
文章目录Leetcode1041.问题描述2.解决方案解法一:深度优先(O(n))解法二:广度优先(O(n))Leetcode5591.问题描述2.解决方案解法一:递归解法二:迭代层序遍历解法三:迭代后序遍历Leetcode1041.问题描述2.解决方案解法一:深度优先(O(n))class Solution {public: int maxDepth(TreeNode* root) { if(root== nullptr) return 0; ret原创 2021-10-03 15:23:21 · 107 阅读 · 1 评论 -
【Leetcode二叉树属性一】101. 对称二叉树 100.相同的树 572. 另一棵树的子树
文章目录Leetcode1011.问题描述2.解决方案Leetcode1011.问题描述2.解决方案class Solution3{public: bool compare(TreeNode* left,TreeNode* right){ if(left!= nullptr&&right== nullptr) return false; if(left== nullptr&&right!= nullptr) return f原创 2021-10-03 10:55:01 · 130 阅读 · 1 评论 -
【Leetcode二叉树修改与构造一】226. 翻转二叉树
文章目录Leetcode2261.问题描述2.解决方案Leetcode2261.问题描述2.解决方案原创 2021-10-02 17:07:57 · 163 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】116. 填充每个节点的下一个右侧节点指针 117. 填充每个节点的下一个右侧节点指针 II
文章目录Leetcode1.问题描述2.解决方案思路:1.2.3.代码:Leetcode1.问题描述2.解决方案思路:1.怎么硕呢,其实大致思路无非记录每一层的首结点,然后在遍历到这一层后面的结点时把这个结点赋给前一个节点的next,但是唉代码实现起来它还真不简单(对于本菜鸡来说)2.1.首先第一个错误想法,我寻思着在每一层结束后,意思是queue完整的存储着某一层结点指针的时候进行一个遍历赋值,然后发现这个犯了很大错误,首先如果队列定义为 queue<Node*> q原创 2021-10-02 16:52:03 · 122 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】515. 在每个树行中找最大值
文章目录Leetcode5151.问题描述2.解决方案Leetcode5151.问题描述2.解决方案没什么可说的,就每一层求个最大值,并且每一层结束后把Max放入结果集即可!class Solution {public: vector<int> largestValues(TreeNode* root) { vector<int> ans; queue<TreeNode*> queue; queue原创 2021-10-02 15:32:18 · 136 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】429. N 叉树的层序遍历(这里有很简洁的N叉树的定义哦)
文章目录Leetcode4291.问题描述2.解决方案Leetcode4291.问题描述2.解决方案没什么好说的,就是把每层所有结点,那个类定义中的结点数组都加入队列,其他和层序遍历一样这个N叉树的定义还蛮简洁的记一下!for(int j=0;j<cur->children.size();j++) queue.push(cur->children[j]);ans.push_back(oneLayer);class Solution {public: vec原创 2021-10-02 14:59:11 · 90 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】637. 二叉树的层平均值
文章目录Leetcode6371.问题描述2.解决方案Leetcode6371.问题描述2.解决方案只需要在层序遍历基础上,对每一层求和,在一层结束后,将平均值加入ans结果集中即可!vector<double> ans;vector<int> oneLayer;double sum=0;sum+=cur->val;ans.push_back(sum/len);class Solution {public: vector<double原创 2021-10-02 14:46:14 · 115 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】199. 二叉树的右视图
文章目录Leetcode1991.问题描述2.解决方案Leetcode1991.问题描述2.解决方案除了这两行之外,其他和102. 二叉树的层序遍历一样也就是本题只需要将每一层的最后一个元素加入结果集即可vector<int> ans;ans.push_back(oneLayer[oneLayer.size()-1]);class Solution {public: vector<int> rightSideView(TreeNode* root)原创 2021-10-02 14:32:59 · 123 阅读 · 1 评论 -
【Leetcode二叉树层序遍历】102.二叉树的层序遍历 107.二叉树的层序遍历 II BM27.按之字形顺序打印二叉树
文章目录Leetcode1021.问题描述2.解决方案Leetcode1021.问题描述2.解决方案原创 2021-10-02 11:18:08 · 127 阅读 · 1 评论 -
【Leetcode二叉树的遍历】144 145 94.二叉树的前中后序统一迭代法
未完成…原创 2021-10-02 11:01:42 · 127 阅读 · 1 评论 -
【Leetcode二叉树的遍历】94. 二叉树的中序遍历
文章目录Leetcode941.问题描述2.解决方案Leetcode941.问题描述2.解决方案//正确递归class Solution {public: void inorder(vector<int>& ans,TreeNode* root){ if(root==nullptr) return; inorder(ans,root->left); ans.push_back(root->val);原创 2021-10-01 20:55:39 · 112 阅读 · 1 评论 -
【Leetcode二叉树的遍历】145. 二叉树的后序遍历
文章目录Leetcode1451.问题描述2.解决方案Leetcode1451.问题描述2.解决方案class Solution {public: void pre(TreeNode* root,vector<int>& ans){ if(root== nullptr) return; pre(root->left,ans); pre(root->right,ans); ans.push_ba原创 2021-10-01 20:52:48 · 73 阅读 · 1 评论 -
【Leetcode二叉树的遍历】144. 二叉树的前序遍历
文章目录Leetcode1441.问题描述2.解决方案Leetcode1441.问题描述2.解决方案没什么好说的,vector< int >& ans,记得加引用!class Solution {public: void pre(TreeNode* root,vector<int>& ans){ if(root== nullptr) return; ans.push_back(root->val);原创 2021-10-01 20:48:29 · 83 阅读 · 1 评论