关于C++使用lambda表达式写递归函数时的踩坑记录
关于C++使用lambda表达式写递归函数时的踩坑记录是笔者在写129. 求根节点到叶节点数字之和 - 力扣(LeetCode)这道题时遇到的 问题描述以下代码是跑不通的,在第14行即dfs调用时会发现dfs未定义 1234567891011121314151617181920class Solution {public: int sumNumbers(TreeNode* root) { int ans = 0; auto dfs = [&](TreeNode* node, int x) -> void { if (node == nullptr) { return; } x = x * 10 + node->val; if (node->left == node->right) { // node 是叶子节点 ...
Day93 | 灵神 | 二叉树 求根节点到叶结点数字之和
Day93 | 灵神 | 二叉树 求根节点到叶结点数字之和129.求根节点到叶结点数字之和129. 求根节点到叶节点数字之和 - 力扣(LeetCode) 先序遍历思路:这道题和昨天那道Day92 | 灵神 | 二叉树 路径总和-CSDN博客的区别就是我们要在走这些路径的时候要想办法把当前正在走的路径的数字给算出来 然后昨天那道题是在叶节点处把flag改为true,证明我们找到了一条路径满足条件 今天这个题是在叶子结点时,把你加好的这条路径的和返回给上一级递归函数 而我们如何在路径图中计算数字呢? 设一开始是x=0,那么每经过一个结点就让x*10加上当前结点的值就好了 然后在叶子结点处进行返回就好了 先看先序遍历(dfs)的代码吧可以先看看比较差但是能跑通的笔者的代码 我是用字符串把路径数字都存起来然后在叶子结点处转化为整数再加起来,感觉这个方法笨笨的对比灵神的 12345678910111213141516171819202122232425262728293031323334353637383940class Solution {public: ...
Day92 | 灵神 | 二叉树 路径总和
Day92 | 灵神 | 二叉树 路径总和112.路径总和112. 路径总和 - 力扣(LeetCode) 思路: 1.递归函数意义 如果在根节点为t的树中可以找到长度为target的路径就返回true,找不到就返回false 2.参数和返回值 1bool tra(TreeNode *t,int target) 参数中的target在传入之前会先减掉当前结点的值作为给下一个结点传入的值 如果在根节点为t的树中可以找到长度为target的路径就返回true,找不到就返回false 3.终止条件(边界条件) 如果我们碰到了空节点,那就是false,说明没找到路径 12if(t==nullptr) return false; 4.本层逻辑(非边界条件) 减去本层节点值之后判断是否是我们要找的路径 即在叶子结点,并且target也减到0了 然后递归遍历左右子树,不管哪边找到了我们都可以返回true 123456target-=t->val; if(t->left==nullptr&&t->right==nullptr) ...
Day91 | 灵神 | 二叉树 二叉树的最小深度
Day91 | 灵神 | 二叉树 二叉树的最小深度111.二叉树的最小深度111. 二叉树的最小深度 - 力扣(LeetCode) 后序遍历思路:1.递归函数意义 求得以传入参数t为根节点的树的最小深度 2.参数和返回值 1int get_depth(TreeNode *t) 返回值就是以t为根结点的树的最小深度 3.终止条件(边界条件) 如果我们碰到了空节点,那么它的深度肯定就是0了 12if(t==nullptr) return 0; 4.本层逻辑(非边界条件) 如果 node 是空节点,由于没有节点,返回 0。 如果 node 没有右儿子,那么深度就是左子树的深度加一,即 dfs(node)=dfs(node.left)+1。 如果 node 没有左儿子,那么深度就是右子树的深度加一,即 dfs(node)=dfs(node.right)+1。 如果 node...
Day90 | 灵神 | 二叉树 做题方法 二叉树的最大深度
Day90 | 灵神 | 二叉树 做题方法 二叉树的最大深度灵神的做题方法首先 类似于高中的整体法,将左右子树分别看为一个整体 其次 再次 最后 边界条件和非边界条件怎么算也得想清楚 并且在写代码之前还要想清楚为什么这样做是对的,可以用数学归纳法来说明 边界条件就类似于图中的1,而非边界条件就类似于图中的2 笔者觉得挺好的做题方法1.先想明白递归函数的含义,比如在下面的题中就是求以传入参数t为根节点的树的最大深度 2.想明白递归函数参数和返回值 3.想清楚递归函数结束条件,对应上面的边界条件 4.想清楚递归函数本层逻辑,对应上面的非边界条件 104.二叉树的最大深度104. 二叉树的最大深度 - 力扣(LeetCode) 思路: 1.递归函数意义 求以传入参数t为根节点的树的最大深度 2.参数和返回值 1int get_depth(TreeNode *t) 返回值就是以t为根结点的树的最大深度 3.终止条件(边界条件) 如果我们碰到了空节点,那么它的深度肯定就是0了 12if(t==nullptr) return...
26考研 | 王道 | 数据结构 | 第六章 图
第六章 图6.1....
刷题总结 | 灵神 | 链表章节
刷题总结 | 灵神 | 链表章节包含视频以及简介中的作业部分,但是不是链表章节所有的题单的题,那个太多了,把视频和作业过完一遍再说吧 标签: 链表 | Darlingの妙妙屋 题单 && 题解Day77 | 灵神 | 反转链表 反转链表 反转链表II K个一组翻转链表-CSDN博客 Day78 | 灵神 | 反转链表 两两交换链表中的节点-CSDN博客 Day79 | 灵神 | 反转链表 两数相加 两数相加II_反转链表 灵神-CSDN博客 Day80 | 灵神 | 反转链表 翻倍以链表形式表示的数字-CSDN博客 Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表-CSDN博客 Day82 | 灵神 | 快慢指针 重排链表-CSDN博客 Day83 | 灵神 | 快慢指针 回文链表-CSDN博客 Day84 | 灵神 | 快慢指针 链表最大孪生和-CSDN博客 Day85 | 灵神 | 前后指针 删除链表中的节点 删除链表的倒数第 N 个结点-CSDN博客 Day86 | 灵神 | 前后指针 删除排序链表中的重复元素...
Day89 | 灵神 | 前后指针 合并两个链表
Day89 | 灵神 | 前后指针 合并两个链表1669.合并两个链表1669. 合并两个链表 - 力扣(LeetCode) 思路: 思路较为简单,就是一个模拟题 找到下标a的前一个结点并用p记录下来,继续遍历b-a+1的长度找到下标为b的节点,记录b的下一个节点为q 把list2接到p后,遍历list2,把末尾节点next指向q即可 完整代码: 123456789101112131415161718192021222324252627282930class Solution {public: ListNode* mergeInBetween(ListNode* list1, int a, int b, ListNode* list2) { ListNode *t=new ListNode; t->next=list1; ListNode *p=t; int length=b-a+1; //找到下标为a的结点的前一节点 while(a--) ...
Day88 | 灵神 | 前后指针 移除链表元素 从链表中移除结点
Day88 | 灵神 | 前后指针 移除链表元素 从链表中移除结点2487.从链表中移除结点2487. 从链表中移除节点 - 力扣(LeetCode) 迭代思路: 凡是你觉得反转链表以后好做的都要毫不犹豫反转链表 这道题是因为如果左边的数都比右边这一个数小的话,我们很难找到从哪个结点开始删除 比如[1,2,3,4,5,6,7,8,9,13],1-9全是要删的,我们不知道从哪里开始进行循环 但是反转以后就很简单了 [13,1,2,3,4,5,6,7,8,9],13之后都是要删的,而且13可作为要删除节点的前一个结点,所以翻转后会好做很多 到这里也知道了其实这道题是倒着找最大值,所以反转后会比较好做,因为反转后变成正着找最大值 完整代码: 1234567891011121314151617181920212223242526272829303132class Solution {public: //206.反转链表 ListNode *reverseList(ListNode *head) { ListNode *pre =...
Day87 | 灵神 | 前后指针 移除链表元素 从链表中移除在数组中存在的节点
Day87 | 灵神 | 前后指针 移除链表元素 从链表中移除在数组中存在的节点203.移除链表元素203. 移除链表元素 - 力扣(LeetCode) 思路: 就是一道easy题目,思路并不难想,就从前往后遍历就行 完整代码: 123456789101112131415161718class Solution {public: ListNode* removeElements(ListNode* head, int val) { ListNode *t=new ListNode; t->next=head; ListNode *p=t; while(p->next) if(p->next->val==val) { ListNode *temp=p->next; p->next=p->next->next; ...














