自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 代码随想录算法训练营第六十天|84.柱状图中最大的矩形

因为heights[i] == heights[st.top()],也就是说,如果最后的结果中用到了heights[i],那就必然也会用到 heights[st.top()],而i相对于st.top()有着更远的距离,肯定是i得到的结果更大,所以加上st.pop()就是直接考虑i的情况,而不加就是st.top()和i都考虑。st.pop()加不加对结果没有影响,加上的话在情况三的计算中可以减少运算。这题和之前的单调栈的题思路正好相反,当遇见小于栈顶元素的情况单独处理。

2024-06-04 17:25:19 86

原创 代码随想录算法训练营第五十八天|503.下一个更大元素II,42. 接雨水

我们在计算雨水时需要长乘上高,长的计算是需要序号相减的,在图中情况下,我们需要拿第二个5的序号值去更新第一个5的序号值,从而确保得到的雨水长是正确的。首先确定雨水一定是凹型才能接住,所以单调栈的设定为与更大元素的设定一样,碰见小于栈顶的元素直接入栈。首先,能接多少雨水是由两边更高的数字中比较矮的数字(2、3中的2)决定的,利用i%nums.size()可以实现循环两次。雨水的高还需要在这基础上减去底座(1)的高度。

2024-06-04 16:29:08 110

原创 代码随想录算法训练营第五十七天|739. 每日温度,496.下一个更大元素 I

nums2元素序号-------(单调栈得到结果——nums2的result数组)-------->nums2元素-------(利用nums2元素和nums1元素部分相同——nums1的result数组)-------->所以我们需要建立一个nums1元素和nums1元素序号一一对应的map数组,map的key值是nums1元素,这样就可以通过元素得到。nums1元素序号,nums1元素,nums2元素,nums2元素序号,单调栈。思路和上题一样,主要是要建立nums1 和 nums2 元素的对应关系,

2024-06-04 15:42:38 134

原创 代码随想录算法训练营第五十六天|647. 回文子串,516.最长回文子序列

其实也不一定,eg:aaab,可以发现,0位置的a和3位置的b不相等,但是dp[0][3]要想得到正确的结果,必须继承dp[0][2](aaa)的子序列长度情况,如果直接放弃0位置和3位置,只继承dp[1][2](aa),就会造成数据的缺失。所以dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])至于初始值的设定,需要考虑之前没有考虑的i==j的情况,设定dp[i][i]=1。=s[j]时,很容易推出dp[i][j]=false;当s[i]=s[j]中,需要考虑三种情况。

2024-06-03 11:40:58 236

原创 代码随想录算法训练营第五十五天|583. 两个字符串的删除操作,72. 编辑距离

只要求出两个字符串的最长公共子序列长度即可,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。dp[i][j]=dp[i-1][j-1]dp[0][i]表示word1长度为0,word2长度为i,两者相同需要word2删除i次。添加(等于另一侧删除)dp[i][j]=dp[i][j-1]+1;改变(没有删除)dp[i][j]=dp[i-1][j-1]+1;删除:dp[i][j]=dp[i-1][j]+1;同理,dp[i][0]=i。所以dp[0][i]=i。这里选择最小的情况就型。

2024-06-02 21:30:13 198

原创 代码随想录算法训练营第五十三天|392.判断子序列,115.不同的子序列

t[j - 1],此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];每一次出现有字母相同的情况,不仅要继承之前的已经有的子序列的个数(dp[i-1][j]),还有新产生的子序列个数(dp[i-1][j-1]),这里dp[i-1][j-1]和dp[i][j]数量是完全相同的,只是子序列更长了。当s[i-1]和t[i-1]相同时,子序列长度加一。

2024-06-02 20:56:00 230

原创 代码随想录算法训练营第三十六天|738.单调递增的数字

位置的初始值一定要是nums.size(),这是为了确保当数字已经是单调递增时,不会有位置变成9。但是从前往后,第一个3和第二个3相等,等到递归到2的时候已经没有机会再去更改3了。关键还是循环顺序,是从后往前循环,因为有时候需要动最高位的数字。第二个技巧是记录需要变9的位置,此位置以后所有的数字都要变成9。这题的一般思路是——非单调位置-1,后面所有数字都变成9.以332为例,从后往前是332->329->299,738.单调递增的数字。

2024-05-30 17:50:58 84

原创 代码随想录算法训练营第五十二天|300.最长递增子序列,1035.不相交的线,53. 最大子序和

思路就是,如果dp[i-1]+nums[i]比nums[i]小,也就证明,dp[i-1](i前面几项的和)已经对子序和是一种"拖累",我们需要将它们全部舍弃,重新开始。首先来看递推公式,一个方向是dp[i]=dp[i-1]+nums[i],但是,并不是任何nums[i]都需要加上的,dp[i]会一直增加吗,显然不会,当i和i之后的数据全都小于0时,dp[i]会下降。所以返回的一定不能是dp[nums.size()],而是在这个过程中的最大值。可以注意到dp[1][1]得到的信息并没有传输给dp[3][2]

2024-05-30 17:35:53 116

原创 代码随想录算法训练营第五十一天|300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

dp[i]的推导需要用到i之前的dp数组的值,当nums[i] > nums[j]时,也就是说i可以在以j为末尾的最长子序列上再延长1.dp[i][j]表示以i-1为结尾的A,和以j-1为结尾的B,最长重复子数组的长度为dp[i][j]这题相对于上题题目添加了限制条件,连续要求dp[i]只能通过dp[i-1]推导出来。这样做的好处是方便初始化,可以将dp[0][j],dp[i][0]直接初始化为0。dp数组的含义为dp[i]表示字符串以第i位置为末尾的最长递增子序列的长度。

2024-05-27 20:43:04 180

原创 代码随想录算法训练营第三十五天|435. 无重叠区间、763.划分字母区间

这里的方法是十分巧妙的,由于i是从小到大依次循环,指定字母的值小的会被大的值给覆盖,最后仅用一次循环就实现了最后位置的寻找。这题的思路就是找到每个区间中的字母最后出现的位置,关键是位置怎么找。先对区间进行排序,优先去除交集区间。

2024-05-27 19:45:13 221

原创 代码随想录算法训练营第五十天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

这里有个问题需要处理一下,如果是昨天卖出股票(处于卖出的状态)那么今天一定是处于冷冻期(dp[i][3]),今天是无法进入买入股票的状态的,也就是dp[i][0]不能根据dp[i-1][2]推导出来。dp[1][0]可由dp[0][3]推导,在第一天冷冻第二天买入股票的情况下,要想推导正确,只能将dp[0][3]设置为0,dp[0][2]同理。dp[i][0]由dp[i-1][0]、dp[i-1][2]、dp[i-1][3]推导。dp[i][2]由dp[i-1][2],dp[i-1][0]

2024-05-26 16:00:19 164

原创 代码随想录算法训练营第三十四天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

先考虑身高维度,将身高从大至小进行排列,[5,2]表明在该同学的前面有两个比他更高的人,与从大到小的排列顺序相互对应,之后在根据people[i][1]提供位置数据,将数组中的元素插入到对应的位置上面。遇到账单20,优先消耗美元10,完成本次找零。因为5的用处更大,等到循环结束的时候,如果存在某个美元不够用的情况,那么就是无法找零。优先用箭去射击区间的交集,先。

2024-05-26 15:35:12 183

原创 代码随想录算法训练营第三十三天|1005.K次取反后最大化的数组和,134. 加油站

如果到第i个站台净收益小于0了,那么这个站台(和与这个站台同时纳入sum计算的之前的站台)都不能作为起点,只能从第i+1个站台进行考虑。这里首先每一个站台都是有净收益的,净收益等于该站台所提供的油量-到该站台所消耗的油量。先把所有负数都取反成正数,之后把所有次数都用来对绝对值最小的数字进行取反。1.正向遍历,当第i+1大于i时,i+1处的糖果数量比i多1;2.反向遍历,当第i大于第i+1时,i处的糖果比i+1多1;我们遍历每个站台的净收益,用sum记录遍历的站台净收益之和。优先把绝对值较大的负数取反。

2024-05-24 16:23:41 211

原创 代码随想录算法训练营第四十八、四十九天|121. 买卖股票的最佳时机1-4

dp[2][3]和dp[2][1]的本质其实是一样的,dp[2][3]表示在第2天买入、卖出、再买入,与dp[2][1]的买入是相同的(同一天一次买入和一次卖出相互抵消)考虑递推公式时,dp[i][j]的推导需要前一天的数据(dp[i-1][j]),其中。dp[0][0]很容易想到是0,i=0表示是第0天(的股票价格),j=0表示还没有进行操作,收益自然是0。如果第i天做了操作,那么就是在前一天的基础上(dp[i-1][j-1])再进行一次操作。所以dp[0][1]=-price[0]

2024-05-24 16:09:31 116

原创 代码随想录算法训练营第四十七天|198.打家劫舍

(cur->left得到的{val2, val1}在返回上一级后,会被cur->left所继承,参与到cur这层的选择中)2.不取当前节点,则值为:左节点(取或不取的最大值)+右节点(取或不取的最大值)这里的dp数组大小为2,dp[0]表示不用当前节点,dp[1]表示使用当前节点。遍历的返回值均为数组,因为后序遍历二叉树可以将子节点的情况继承给父节点。1.取当前节点,则值为:当前节点的值+不取左节点的值+不取右节点的值。一定是后序遍历(根据子节点的dp大小选择是否将父节点加入)选择两种情况下的最大值。

2024-05-23 21:13:39 209

原创 代码随想录算法训练营第四十五天|139.单词拆分

这里我们要注意,我们并不是把“物品”放进“背包”,而是检查物品(数组中的元素)能不能组成背包 (s字符串),我们采取j-作为下标i来截取一段s中的字符串,如果这段字符串能够在数组中找到,同时dp[j]为true,那么证明dp[i]为true。关键就是数组中元素的遍历,我们需要得到的是dp[s.size()]是否为true,所以dp数组需要是一个bool类型的数组,元素遍历我们采取int类型的变量j进行循环。这题首先肯定是排序问题而不是组合问题,因为单词的顺序是一定的,所以组成单词的字符串顺序也是一定的。

2024-05-23 20:32:51 227

原创 代码随想录算法训练营第四十四天|70. 爬楼梯(进阶版)

INT_MAX这个条件是确保在利用dp[j - coins[i]]得到dp[j]的过程中,所使用的一定是更新过的dp[j - coins[i]],防止dp[j - coins[i]]为未更新过的初始值,影响dp[j]的正常推导。因为无论排列和组合,求出的最小商品数都是相同的,所以可以先循环容量,再循环商品,反过来也行。多重背包问题,代取商品就是从1:m的数组,背包的容量就是n,由于是求方法数,所以递推公式为。此题是求最小的情况,也就是把背包装满所用的最小的商品数,

2024-05-22 18:20:08 249

原创 代码随想录算法训练营第四十三天|

也是完全背包问题,但是需要求排列而不是组合,所以需要先遍历背包容量,再遍历物品。典型的完全背包问题,但这里是求有多少种组合方式,所以递推公式变为。

2024-05-22 16:05:27 185

原创 代码随想录算法训练营第四十二天|1049.最后一块石头的重量II,494.目标和,474.一和零

本题可以转化为:将石头分成尽量重量相同的两堆(重量相同相撞为0),分成两堆后剩下的石头重量就是题解。dp[j]表示容量为j的背包,最大可以携带的石头重量(价值)为dp[j],石头的重量是 stones[i],石头的价值也是 stones[i],所以递推公式为dp[j - stones[i]] + stones[i])表示消耗了 stones[i]的重量,获得了stones[i]的价值(重量)

2024-05-21 17:34:20 173

原创 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机 II,

122.买卖股票的最佳时机 II。

2024-05-16 18:16:44 193

原创 代码随想录算法训练营第四十一天|416. 分割等和子集

首先是二维背包。递推公式表明推导出dp[i][j]需要dp[i-1][j],有两种推导途径1.现在背包剩余的容量j不够再放下标为i的物品,所以背包内的价值不变。2.背包内剩余容量还够放下物品,[j - weight[i]] + value[i]表示在dp[i-1][j]的基础上消耗了weight[i]的容量,额外得到了value[i]的价值。dp数组的初值也可以推导,dp[i][0]为0,因为容量为0,放下的物品为0,所以价值为0.

2024-05-16 17:00:06 225

原创 代码随想录算法训练营第三十一天|455.分发饼干,376. 摆动序列,53. 最大子序和

优先把小饼干分给胃口值小的,或者是把大饼干分给胃口大的。这里有一些初始值的设置是为了应对一些特殊情况的因为当nums尺寸大于等于2时,摆动序列长度至少为1;这里加上等于号是因为中间存在平坡的情况,如果不加等于号的话,第一个2其实也算摆动序列,但是不会被计入。result++;// 注意这里,只在摆动变化的时候更新prediff这里只在摆动变化时更新pre是为了防止非严格单调上升的序列在平坡开始处和平坡截止处各计算一次,导致摆动序列结果多了。

2024-05-15 20:07:01 293

原创 代码随想录算法训练营第四十天|343. 整数拆分,96.不同的二叉搜索树

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。这里取到j <= i / 2是因为在拆成多个数字相乘的时候,一定是拆分成m个近似相同的子数相乘才是最大的。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。

2024-05-15 16:09:12 189

原创 代码随想录算法训练营第三十天|332.重新安排行程,51. N皇后,37. 解数独

首先如果只根据前后站的关系找到一种可能的行程,然后将可能的行程与当前的字符最小行程进行比较,最后得到最小行程的思路会超时,所以一定要在回溯中就确保只有字符最小的情况进入回溯。map会对索引值进行排序,可以保证每一次都是字符最小的情况是票数的统计情况,每当我们插入一个站时,消耗了一张票,我们就把对应该票的票数减一。由于我们已经用map确保了字符最小,所以只要我们找到一种可能的情况,就能确定他是我们所需要的情况,直接返回就行,所以这里返回值为bool,从而确保只要找到情况即刻返回,不会继续递归。

2024-05-14 20:08:58 219

原创 代码随想录算法训练营第三十九天|62.不同路径,63. 不同路径 II

2.障碍物在第一行/第一例,在赋初值的时候会有影响,以第一行为例,当i列出现障碍物时,列数大于i的走法都变成0了。3.障碍物在其他地方,我们求一个格子的走法时,是将其左边格子的走法和上方格子的走法加起来,代码随想录中的思路则更加简单,遇见障碍物直接跳过赋值(因为dp数组初始值已经置为0了)如果左方格子是障碍物,那么只加上上方格子的走法,如果左上都是障碍物直接返回。然后需要确定初始值,需要第一行和第一列所有格子的走法。因为第一行/第一列是一条直线,所以走法只有一种。接下来考虑障碍物,分几种情况考虑。

2024-05-14 16:14:19 202

原创 代码随想录算法训练营第三十八天|70. 爬楼梯

也就是说,踩上楼梯是不需要花费的,只有从此楼梯再网上爬需要支付费用,所以0和1处的花费为0(因为这两处一开始就可以踩上去)i处的楼梯爬法是i-1处的爬法和i-2处的爬法之和(因为一次可以爬一格或者两格)。从i-1爬一格(因为往上爬了,需要支付i-1处的cost)从i-2爬两格(因为往上爬了,需要支付i-2处的cost)因为一次可以爬一格/两格,所以有两种思路。从两者中选小的就行了。

2024-05-13 22:13:28 103

原创 代码随想录算法训练营第二十八天|491.递增子序列

这题是在无法进行排序的情况下如何进行树层去重,思路是每一层都新建一个set容器进行比较每一树层插入一个数字,就会记录在set中,当这一层再次出现相同数字时,set中的find函数会发现这个数字已经被使用过,跳过该次循环。问题是我在函数外侧建立好set数组,每一层都重新清空可不可以、左边是重新建立set,右边是清空set,红色数字是代码执行的顺序可以看到,右边第4步的set容器继承了第三步的结果,再插入7,容器中只剩下7,4不见了。

2024-05-10 11:09:15 301

原创 代码随想录算法训练营第二十八天|93.复原IP地址

第三就是insert的使用方式s.insert(s.begin()+3,'.'),在字符串s的3处插入‘.’因为不能出现重复的组合,所以需要startIndex记录每次循环开始的位置(可以参考前几天的博客)这里的最后的返回结果是vector<string>,那么应该拿什么储存中途满足条件的变量?经典的树层去重(参考昨天的博客,写的很详细了),used[i-1]==false;由于这题最多只有四个数字,可以记录点(.)的个数,当点的个数=3时,子集需要树上的每一个节点都纳入结果,而不是只有最底下的节点。

2024-05-09 21:13:27 315

原创 代码随想录算法训练营第二十七天|39. 组合总和,40.组合总和II ,131.分割回文串

此时1(1)为首元素的树层情况已经构建完成,1(1)对应的位置used已经又由true变为false了,所以考虑1(2)时,1(2)就不会再进入path了。当i=0循环结束时。此时used已经变成[0,1,1],进入i=1的循环,由于满足continue的条件,i=1被跳过了。以[1(1),1(2),2]为例,当我们在进行树枝的构造时,使用过的元素,used对应的位置一定全是true,以[2,2,2],target=2为例,如果哦我们将used设置为true,现在的used就是[1,1,1]。

2024-05-09 17:19:48 598

原创 代码随想录算法训练营第二十五天|216.组合总和III

可以看到,递归遍历了所有可能的数组,但是在插入数据到结果中的时候,我们只选择sum与n相等的组合进行插入,在递归中加上变量sum用来统计元素之和。这题还是用过的数字就可以不要了(因为不能有重复的组合),所以加上了start这一变量用来确定每次循环在哪里开始。1.数字2进入递归,找到数字2对应的字符串“abc”,abc中的a进入res,此时进入下一层递归3。找到3对应的字符串“def”由于for循环的存在,当再次返回到2的递归时,result中已经有。第二种限制条件的处理就是在递归中进行数据的筛选。

2024-04-27 16:09:11 268

原创 代码随想录算法训练营第二十四天|77.组合

1.递归的终止条件,当v1的大小和k个数的组合k相同时,递归结束,将v1插入result中。for循环中的digui(i+1),就到了2,之后递归中在继续递归3,4,2.i=2,因为从start开始的,start=i+1=3,避免了重新从1开始的情况。2.start的利用,start是为了防止重复的情况出现,第一次递归时start=1,i从1循环到4,以1,2,3,4中取两个元素为例。返回[1,2]、1,3,1,4。

2024-04-26 23:45:34 84

原创 代码随想录算法训练营第二十三天|538.把二叉搜索树转换为累加树,669. 修剪二叉搜索树

回到1.节root->left=digui(root->left,low,high)的执行,此时root=3,digui(root->left,low,high)返回的是节点2,此时3的左节点改为了2,0的删除结束。1. 3进入递归函数,此时root=3节点的指针(以下简称3,用节点的值代指节点),3在[1,3]内,不会进入if。因为2的右节点为空,所以root->right=null,root->left=1满足[1,3],所以直接返回1。3. 此时root=2,因为2满足[1,3],执行。

2024-04-26 20:31:51 316 1

原创 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先这题和昨天的最后一题一样,但是搜索树是有性质的。只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的最近公共祖先。

2024-04-25 21:41:02 411 2

原创 代码随想录算法训练营第二十一天|501.二叉搜索树中的众数,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先

NULL) 这时候root的左子树有一个值p,右子树有一个值q,所以root就是祖先(因为我们是自底而上进行遍历的,所以只要出现满足条件的节点就必然是最近祖先)这题和上面一题的思路相似,都是上个指针和当前指针的关系,因为中序遍历是有序的,所以相同的节点值必然出现在上个指针和这个指针之间。这里举了个例子,即使2不是祖先,但是祖先一定在2的上面的节点,该节点的右子树(包括2)含有8,我们要把这个信息传输到上一层,所以。这里有两个需要记录的元素,一个是出现的数字,一个是出现数字的个数,所以采用map。

2024-04-25 15:30:50 876 2

原创 代码随想录算法训练营第十八天|98.验证二叉搜索树, 654.最大二叉树

肯定不能加的,返回true需要的条件更为苛刻,当前的节点root需要返回true的话还需要digui(root->right)的信息,现在只用到了digui(root->left)的信息,所以这里不能返回true。同时对两个二叉树进行相同的递归就行,值得注意的是,当root1为空时,直接返回root2就行,这样可以简化计算。这题的最主要思路就是如果是二叉搜索树的话,中序遍历一定是从小到大的有序遍历(想不到这题就不好写)当寻找的值大于当前节点的值时,就去当前节点的右子树寻找,反之就去左子树寻找。

2024-04-24 21:37:09 253

原创 代码随想录算法训练营第十七天|513.找树左下角的值,112. 路径总和+113. 路径总和ii(待补迭代),106.从中序与后序遍历序列构造二叉树

这里如果5-8-4-5这个路径遍历完后,还需要遍历5-8-4-1这个路径,return之后回到4这个节点,此时你的sum应该是5+8+4,(因为回到4后你现在已走的路径只是5-8-4),是不是要把之前留在sum中的5(5+8+4+5)减去才符合当前的实际情况。v1的变化也是同理。二叉树一般采用递归和迭代,此题怎么选,因为在构造二叉树时,我们先构造最初的节点(root),之后再补充root->left和root->right,可以用构造root相同的思路去构造root->left,所以想到此题用递归。

2024-04-21 21:59:56 285 1

原创 代码随想录算法训练营第十六天|110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

这题的关键有两个:一个是如果任意节点的字数不满足平衡二叉树,就可以直接返回false,不需要遍历其它的节点。这里-1的设计很好,个人理解为1-(-1)>1,所以即使是另一边子树是只有一个节点的极端情况,也能确保将-1数据传递给出去。迭代需要分别考虑root的left和right,返回左|右子树高度的最大值+1(因为当前节点也需要计算所以加1)。迭代法只要能够遍历整个二叉树就行,主要还是分辨左叶子,要通过节点的父节点来判断其左孩子是不是左叶子了。

2024-04-20 00:17:39 154

原创 代码随想录算法训练营第十五天 |104.二叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数(待补)

222.完全二叉树的节点个数。104.二叉树的最大深度。111.二叉树的最小深度。

2024-04-18 20:28:19 83

原创 代码随想录算法训练营第十四天 |二叉树的层序遍历 ,226.翻转二叉树,101. 对称二叉树(待补)

层序遍历。

2024-04-18 20:17:56 66

原创 代码随想录算法训练营第十三天 |二叉树的迭代遍历和递归遍历

这里前后遍历本质上是一样的,只不过后遍历需要反转,也就是说,只要能把问题转化成存中->右->左/存中->左->右就能在入栈时同时完成赋值,本质上来说,赋值时是将每一个节点当作中部节点考虑的,但是中序遍历时存中没有办法处于循环的最开始处,所以需要额外加上指针确认节点的位置,能够找到遍历最初的位置。设置好递归结束的条件(指针为空),根据不同的三种情况调整左,存中,右的顺序。之后在主函数中调用递归函数。总结:递归法除了主函数还要写一个递归函数,递归函数的参数是数组和二叉树的指针。

2024-04-16 20:29:21 110

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除