![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
algsup
这个作者很懒,什么都没留下…
展开
-
[递归][dfs]leetcode222:完全二叉树的节点个数(medium)
【代码】[递归][dfs]leetcode222:完全二叉树的节点个数(medium)原创 2023-01-15 15:46:55 · 263 阅读 · 0 评论 -
[双dfs]leetcode2458:移除子树后的二叉树高度(hard)
【代码】[双dfs]leetcode2458:移除子树后的二叉树高度(hard)原创 2022-11-07 20:51:24 · 435 阅读 · 0 评论 -
[bfs][dfs]leetcode6182:反转二叉树的奇数层(medium)
思路1:比较直观的方式是使用 bfs 来翻转奇数层的所有节点值,这里需要使用双端队列 deque 来实现,不然使用单向队列 queue 实现容易陷入思想误区。这样来交换奇数层的节点值,同时奇数层的节点值交换是顺着祖先自上而下的,也就是最左边的节点值和最右边的节点值交换,依次向中间靠拢交叉交换的。设计 dfs 需要同时考虑。原创 2022-09-19 09:37:10 · 382 阅读 · 0 评论 -
[二叉树][dfs][bfs]leetcode297:二叉树的序列化与反序列化(hard)
题目:题解:原创 2019-08-21 19:36:19 · 320 阅读 · 0 评论 -
[二叉树]leetcode236:二叉树的最近共同祖先(medium)
题目:解题思路:说实话被这题困了好久了,代码是参考评论区的,递归代码没读懂啥意思。后来慢慢明白了一点吧,这个递归就类似于走迷宫问题,要注意回溯。留个坑吧,以后在解答具体递归过程。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { ...原创 2019-08-21 12:17:04 · 405 阅读 · 0 评论 -
[dfs]leetcode988:从叶结点开始的最小字符串(medium)
题目:题解:思路:枚举字典序最小的搜索路径即可。代码如下:class Solution {public: string res; string smallestFromLeaf(TreeNode* root) { dfs(root,""); return res; } void dfs(TreeNode* root,string path) { if(!root->left&&am原创 2022-02-19 19:31:24 · 200 阅读 · 0 评论 -
[bfs][二叉树]leetcode993:二叉树的堂兄弟节点(easy)
题目:题解:由于要求 x y 处于同一层,很自然想到了用层序遍历,然而题目要求父节点不同,则队列中使用 pair 来保存<当前节点,父节点>即可,若当前节点的值等于 x 或 y,则添加父节点,最后判断 x 和 y 的父节点是否相同。代码如下:using PTT = pair<TreeNode*,TreeNode*>;class Solution {public: // bfs即可。队列中存放pair,pair的第一个元素为当前节点,第二个元素父节点原创 2022-02-18 11:18:45 · 199 阅读 · 0 评论 -
[二叉树]leetcode404:左叶子之和(easy)
题目:题解:思路:确定递归边界:空节点和叶子节点返回0;左叶子节点则进行统计 val。然后递归遍历左右子树寻找左叶子节点。代码如下:class Solution {public: int sumOfLeftLeaves(TreeNode* root) { // 空节点或叶子节点直接返回0 if(!root||(!root->left&&!root->right))return 0; int sum=0;原创 2022-02-18 10:04:01 · 196 阅读 · 0 评论 -
[二叉树]leetcode1325:删除给定值的叶子节点(medium)
题目:5317. 删除给定值的叶子节点题解:思路:利用树的后序遍历(左右根),由下至上、由左至右的删除值为target的叶子节点代码如下:class Solution {public: TreeNode* removeLeafNodes(TreeNode* root, int target) { return dfs(root,target); ...原创 2020-01-19 22:00:36 · 495 阅读 · 0 评论 -
[二叉树的层序遍历]leetcode513:找树左下角的值(medium)
题目:513. 找树左下角的值题解:利用二叉树的层序遍历来寻找最后一层的最左边节点的值,注意进队列方式为从右至左的,这样保证最后的p为最后一层的最左边的节点。代码如下:class Solution {public: //层序遍历:从右至左,这样最后一个节点的值就是最左下角的值 int findBottomLeftValue(TreeNode* root) {...原创 2020-01-10 00:04:43 · 235 阅读 · 0 评论 -
[二叉树][dfs]leetcode872:叶子相似的树(easy)
题目:题解:使用dfs,分别两棵树的所有叶子节点存放在两个vector中,最后判断两个vector是否相等就好了。代码如下:class Solution {public: bool leafSimilar(TreeNode* root1, TreeNode* root2) { vector<int> nums1,nums2; ...原创 2020-01-09 23:34:23 · 248 阅读 · 0 评论 -
[二叉树][dfs]leetcode572:另一个树的子树(easy)
题目:572. 另一个树的子树题解:两层递归,第一层递归,来确定t与s相等,还是t是s的左子树或s的右子树。第二层递归,判断这两棵树是否相等。一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵树的左子树;要么这棵树是另一颗树的右子树。代码如下:class Solution {public: //一棵树是另一颗树的子树:要么这两棵树相等;要么这棵树是另一棵...原创 2020-01-09 22:18:11 · 194 阅读 · 0 评论 -
[二叉树][dfs]leetcode437:路径总和 Ⅲ (easy)
题目:题解:两重递归,第一个递归就是递归每个节点从上到下的路径,第二个递归就是计算该节点从上到下的路径个数。代码如下:class Solution {public: int res=0; int pathSum(TreeNode* root, int sum) { if(!root)return 0; int cnt=0; ...原创 2020-01-09 18:53:39 · 278 阅读 · 0 评论 -
[dfs]leetcode404:左叶子之和(easy)
题目:题解:简单的dfs代码如下:class Solution {public: int sumOfLeftLeaves(TreeNode* root) { if(!root)return 0; int sum=0; dfs(root,sum); return sum; } void df...原创 2020-01-04 23:56:17 · 177 阅读 · 0 评论 -
[前序遍历]leetcode1305:两棵二叉搜索树中的所有元素(medium)
题目:5296. 两棵二叉搜索树中的所有元素题解:直接利用树的前序遍历将两课树的所有节点值存放在一个数组中,然后将数组排序输出就好了。代码如下:class Solution {public: vector<int> getAllElements(TreeNode* root1, TreeNode* root2) { vector<i...原创 2019-12-29 23:05:59 · 218 阅读 · 0 评论 -
[dfs]leetcode257:二叉树的所有路径(easy)
题目:题解:经典的dfs框架,大家直接看代码即可。代码如下:class Solution {public: vector<string> binaryTreePaths(TreeNode* root) { if(!root)return {}; vector<string> res; helper(...原创 2019-12-27 23:55:05 · 195 阅读 · 0 评论 -
[二叉树的层序遍历]leetcode199:二叉树的右视图(medium)
题目:题解:二叉树的层序遍历,添加每层最后一个节点值。代码如下:class Solution {public: //思路:二叉树的层序遍历,添加每层最后一个节点值 vector<int> rightSideView(TreeNode* root) { if(!root)return {}; vector<int&...原创 2019-12-21 18:33:34 · 199 阅读 · 0 评论 -
[dfs]leetcode129:求根到叶子节点数字之和(medium)
题目:129. 求根到叶子节点数字之和题解:深度优先搜索递归求出左右子树的和,然后相加得到最终结果。代码如下:class Solution {public: //题解:dfs int sumNumbers(TreeNode* root) { return helper(root,0); } long long helper(T...原创 2019-12-12 16:20:12 · 169 阅读 · 0 评论 -
[二叉树]leetcode109:有序链表转换二叉搜索树(medium)
题目:题解:思路:用两个指针,一块一慢,快的每次走两步,慢的每次走一步,这样当快指针遍历结束时,慢指针指向的也就是链表的中间位置。这时候把中间位置的节点的值作为二叉搜索树根节点的值。因为二叉搜索树对应的就是一个有序数组,根节点对应的元素值为为有序数组最中间的位置。代码如下:class Solution {public: TreeNode* sortedListToBST(L...原创 2019-12-08 15:25:24 · 576 阅读 · 0 评论 -
[dfs]leetocde687:最长同值路径(medium)
题目:687. 最长同值路径题解:本题原创 2019-12-08 14:32:28 · 141 阅读 · 0 评论 -
[二叉树]leetcode124:二叉树中的最大路径和(hard)
题目:124. 二叉树中的最大路径和题解:递归对于任意一个节点,如果最大路径包含该节点,那么只可能有两种情况:1、其左右子树中所构成的和路径值较大的加上该节点的值向父节点回溯构成最大路径2、左右子树都在最大路径中,加上该节点的值构成了最终的最大路径代码如下:class Solution {public: /* 对于任意一个节点,如果最大路径包含该节点,...原创 2019-12-08 10:57:12 · 179 阅读 · 0 评论 -
[二叉树]leetcode114:二叉树展开为链表(medium)
题目:114. 二叉树展开为链表题解:题解1:先序遍历,非原地算法,时间复杂度为O(n),空间复杂度为O(n)题解2:将右子树连接到左子树的最右边节点上,然后左子树移动到原来右子树的地方,最后将根节点的左子树赋为空题解3:变形的后序遍历,遍历顺序为右左根(已变形),主要要使用一个全局变量pre来保存已修改好的root节点。题解1:class Solution {publ...原创 2019-12-08 10:21:08 · 147 阅读 · 0 评论 -
[回溯法][树]leetcode113:路径总和 Ⅱ (medium)
对于树形结构采用dfs的策略寻找所有可行解,就是运用的回溯法。原创 2019-12-06 20:59:31 · 253 阅读 · 1 评论 -
[树][递归]leetcode100:相同的树(easy)
题目:100. 相同的树题解:对于树用递归最好解决了,若节点都为空,则表示相同的树;若节点都不为空,则节点值相同,那么我们需要递归判断左右子树是否相等的;若节点有一个不为空,一个为空,或者节点值不相同,则不为相同的树。代码如下:class Solution {public: bool isSameTree(TreeNode* p, TreeNode* q) { ...原创 2019-12-06 20:01:48 · 83 阅读 · 0 评论 -
[二叉树]leetcode5264:在受污染的二叉树中查找元素(medium)
题目:5264. 在受污染的二叉树中查找元素题解:题解1:dfs+前序遍历,自己打比赛写的垃圾代码(待优化)题解2:dfs+map,参考大佬的优秀代码(已优化)题解1代码如下:class FindElements {private: TreeNode* root;public: FindElements(TreeNode* root) { ...原创 2019-11-17 23:03:31 · 195 阅读 · 0 评论 -
[二叉树]leetcode105:从前序与中序遍历序列构造二叉树(medium)
题目:题解:可参考从中序与后序遍历序列构造二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), ri...原创 2019-08-19 17:59:26 · 160 阅读 · 0 评论 -
[二叉树]leetcode94:二叉树的中序遍历(medium)
题目:题解:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-08-19 18:23:15 · 212 阅读 · 0 评论 -
[二叉树]leetcode145:二叉树的后序遍历(hard)
题目:题解:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-08-19 18:20:37 · 199 阅读 · 0 评论 -
[N叉树]leetocde429:N叉树的层序遍历(easy)
题解:题解:原创 2019-09-03 23:12:34 · 148 阅读 · 0 评论 -
[二叉树]leetcode106:从中序与后序遍历构造二叉树(medium)
题目:解题思路:1)后序数组的最后一个元素为根节点,根据根节点可将中序数组划分为左子树中序列表和右子树中序数组2)又因为一棵树的中序数组长度与后序数组长度大小相同,所以可以根据长度划分后序数组为左右子树后序数组3)对于根的左右结点,递归调用即可/** * Definition for a binary tree node. * struct TreeNode { * ...原创 2019-08-19 17:35:00 · 186 阅读 · 0 评论 -
[N叉树]leetcode590:N叉树的后序遍历(easy)
题解:题解:class Solution {public: //解法1:迭代版 vector<int> postorder_1(Node* root) { if(nullptr==root)return {}; vector<int> result; stack<Node*> record;...原创 2019-09-04 00:02:40 · 187 阅读 · 0 评论 -
[N叉树]leetcode589:N叉树的前序遍历(easy)
题目:题解:原创 2019-09-03 20:12:43 · 206 阅读 · 0 评论 -
[二叉树]leetcode111:二叉树的最小深度(easy)
题目:题解:终止条件、返回值和递归过程:1)当前节点root为空时,说明此处树的高度为0,0也是最小值。2)当前节点root的左子树和右子树都为空时,说明此处树的高度为1,1也是最小值。3)如果为其他情况,则说明当前节点有值,且需要分别计算其左右子树的最小深度,返回最小深度+1,+1表示当前节点存在有1个深度。时间复杂度:O(n),n为树的节点数量。代码如下:class ...原创 2019-11-08 17:19:13 · 225 阅读 · 0 评论 -
[二叉树]leetcode102:二叉树的层次遍历(medium)
题目:题解:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-08-19 18:25:54 · 195 阅读 · 0 评论 -
[二叉树]leetcode107:二叉树的层次遍历 II (easy)
题目:题解:直接将层序遍历得到的结果反转即可。代码如下:class Solution {public: vector<vector<int>> levelOrderBottom(TreeNode* root) { vector<vector<int>> result; if(nullptr==r...原创 2019-11-08 16:49:08 · 139 阅读 · 0 评论 -
[二叉树]leetcode103:二叉树的锯齿形层次遍历(medium)
题目:题解:利用二叉树的层序遍历,然后用一个变量来记录树的深度(0、1、2...),深度为偶数,从左向右添加这层的节点值;深度为奇数,从右向左添加这层的节点值。代码如下:class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if(r...原创 2019-11-08 16:46:07 · 171 阅读 · 0 评论 -
[二叉树]leetcode144:二叉树的前序遍历(medium)
题目:题解:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-08-19 18:17:32 · 248 阅读 · 0 评论