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

文章探讨了如何使用递归和层序遍历来解决二叉树问题,包括找树左下角的值、路径总和以及从遍历序列构造二叉树。递归方法在路径总和问题中通过判断根节点到叶子节点的路径和,而在构造二叉树问题中利用前序和中序遍历的分割逻辑。层序遍历在找树左下角的值问题中显得更为简便。
摘要由CSDN通过智能技术生成

513.找树左下角的值

513. 找树左下角的值 - 力扣(LeetCode)

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例 1:

输入: root = [2,1,3]
输出: 1
示例 2:

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
 

提示:

二叉树的节点个数的范围是 [1,104]
-231 <= Node.val <= 231 - 1 

总结:该题采用递归法稍显麻烦一点,迭代法中的层序遍历反而更简单,下面给出递归法的思路。

        ①递归的参数为根节点和记录节点当前深度的depth,无返回值,需要两个类内的全局变量,一个记录结果result,一个记录最大深度在探索到叶子结点的时候进行判定更新。

        ②递归的终止条件是遍历到叶子节点时,判断当前叶子节点的深度和最大深度的大小,对最大深度进行更新,如果此节点深度更大,将该节点的值赋给result。

        ③递归的单层循环是,如果左子节点不为空,则深度加1,并递归左子树,最后回溯让深度减1;如果右子节点不为空,则深度加1,并递归右子树,最后回溯让深度减1。

 解法代码:代码随想录 (programmercarl.com)

112. 路径总和

112. 路径总和 - 力扣(LeetCode)

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:


输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:


输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:

输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。
 

提示:

树中节点的数目在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000

总结:递归逻辑如下:

        ①递归的参数为根节点,int类型的目标值target,返回值类型为bool。

        ②递归的终止条件为当遍历到叶子节点的时候,判断当前总和是否等于target,等于返回TRUE,否则返回false。在判断终止条件前,先将当前节点的值加入总和sum。

        ③递归的单层逻辑为,左子节点不空时:将左子节点放入递归函数中,并判断其返回值bool类型是否为TRUE,是则返回TRUE,否则进行回溯(sum的值减去左子节点的值);右子节点不空时:将右子节点放入递归函数中,并判断其返回值bool类型是否为true,是则返回true,否则进行回溯(sum的值减去右子节点的值)。最后上述都走完了,返回false。

解法代码:代码随想录 (programmercarl.com)

113. 路径总和ii

113. 路径总和 II - 力扣(LeetCode)

总结:暂时还没找到自己的代码问题出在哪里。

解法代码:代码随想录 (programmercarl.com)

106.从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

105.从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

总结:这个类型的题就是注重逻辑上的分割。前序和后序都可以直接找到根节点,根据该根节点可以在中序遍历的数组中找到这个根节点的位置,该根节点可以将中序遍历分割成左数组和右数组,左数组为左子节点的中序,右数组为右子节点的中序;根据中序的左数组的size大小可以将前序和后序分割成两个数组,左数组为左子节点的前或后序遍历,右数组为右子节点的前或后序遍历。这样形成了递归。终止条件为判断前序或者后序数组size是否为0,返回NULL,为1返回root。

解法代码:代码随想录 (programmercarl.com)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值