513.找树左下角的值
给定一个二叉树的 根节点 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. 路径总和
给你二叉树的根节点 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
总结:暂时还没找到自己的代码问题出在哪里。
解法代码:代码随想录 (programmercarl.com)
106.从中序与后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
105.从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
总结:这个类型的题就是注重逻辑上的分割。前序和后序都可以直接找到根节点,根据该根节点可以在中序遍历的数组中找到这个根节点的位置,该根节点可以将中序遍历分割成左数组和右数组,左数组为左子节点的中序,右数组为右子节点的中序;根据中序的左数组的size大小可以将前序和后序分割成两个数组,左数组为左子节点的前或后序遍历,右数组为右子节点的前或后序遍历。这样形成了递归。终止条件为判断前序或者后序数组size是否为0,返回NULL,为1返回root。