代码随想录算法训练营第十八天|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

代码随想录算法训练营第十八天|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

平衡二叉树

题目:513.找树左下角的值
题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/
文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html
视频讲解:https://www.bilibili.com/video/BV1424y1Z7pn/
状态:

自己看到题目的第一想法

直接使用层序遍历,左边第一个节点的值就是层序遍历之后最下层列表的第一位。

看完代码随想录之后的想法

代码随想录出了提出层序遍历的方法还有一种递归的方法。
题目:在树的最后一行找到最左边的值。
递归的方式:使用递归法深度最大的叶子节点就是最后一行,所以要找深度最大的叶子节点。

自己实现过程中遇到哪些困难

路径总和

112. 路径总和、113. 路径总和 II
文章讲解:https://programmercarl.com/0112.%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8C.html
题目链接:https://leetcode.cn/problems/path-sum/;https://leetcode.cn/problems/path-sum-ii/
视频讲解:https://www.bilibili.com/video/BV19t4y1L7CR/

自己看到题目的第一想法

使用递归+回溯的方式去计算每次链路的和,整体遍历使用后序遍历。
递归三步骤:

  1. 确定参数和返回值:参数为Node、path(用于回溯和累加)和targetNum,返回值为boolean类型,表示是否存在hasPathSum。
  2. 递归结束判断:每次进入递归大方法后将值add到path中,判断当前节点是否为叶子节点(无left无right),为叶子节点的话取出path求和与targetNum比较。
  3. 每层递归逻辑:因为是后序遍历,所以先做左节点递归的到左节点递归的路径,得到boolean类型的比较结果,执行完后pop-path回溯。然后同理做右节点递归。左右递归处理完处理中间判断,返回leftResul || rightResut,其中一个满足true即可。

看完代码随想录之后的想法

方法确实是使用前序遍历+递归去处理逻辑。
递归的三步骤:

  1. 出参数为void,入参数为节点、path列表以及结果列表
  2. 递归循环的终止条件:左右子节点都为空,则将path结果转换为字符串放入结果集
  3. 单层循环的处理逻辑:左右子节点递归完后处理回溯,将节点从path弹出。
    核心的逻辑是回溯的处理,通过路径数组path的回溯,将1->2->5 回溯到1,然后再执行右节点。

自己实现过程中遇到哪些困难

  1. 回溯节点时在哪里做回溯操作没思考清楚。1->2->5处理完了,然后再弹出5、弹出2,因此回溯的位置应该是在做左递归或者右递归的节点后处理的。
  2. 路径总和 II整体思路和原来的路径总和1类似,但是核心区别是将匹配到的结果的数组塞到了大结果集中,这里要关注的是因为原来的处理逻辑会处理回溯逻辑,path数组集合内的东西会被弹出,因此往结果集里添加的时候需要new一个数组集合。

左叶子之和

106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树
文章讲解:https://programmercarl.com/0106.%E4%BB%8E%E4%B8%AD%E5%BA%8F%E4%B8%8E%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
题目链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
视频讲解:https://www.bilibili.com/video/BV1vW4y1i7dn/
状态:

自己看到题目的第一想法

看视频

看完代码随想录之后的想法

整体性思路,通过后序先找到中间节点,再通过中序,划分左右节点。
整体逻辑:

  1. 后序数组为0,空节点
  2. 后序数组最后一个元素为中间节点元素
  3. 寻找中序数组位置用第二步求出的中间节点元素作切割点
  4. 切中序数组,得到左中序、右中序
  5. 切后序数组,得到左后序、右后序
  6. 递归处理左区间、右区间

写代码的时把切数组的结果都打印出来,如左中序、右中序;左后序、右后序

自己实现过程中遇到哪些困难

  1. 整体题目的思路还是按照看完代码随想录里的顺序去写的,代码大体上都没问题,问题主要出现在处理切割逻辑这块,切割逻辑这块要按照循环不变量的思想去处理,确定开闭区间,如左开右闭或者左闭右开。这里处理才不会出现问题。
  2. 边界条件的判断遗漏:前序数组的长度为1时,该节点为叶子节点,直接返回。
  3. 处理后序切割的时候需要考虑到舍弃最后一个元素

今日收获&学习时长

学习大概2小时
收获如上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值