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

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

文章来源:代码随想录

题目名称:513.找树左下角的值

给定一个二叉树,在树的最后一行找到最左边的值。

示例 1:
在这里插入图片描述

第一想法:

在最下层,使用层序遍历最好做

解答思路:

迭代法层序遍历最好做
使用递归法也可以,就是找到深度最大的最左值
我们来分析一下题目:在树的最后一行找到最左边的值。

首先要是最后一行,然后是最左边的值。

如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。

如果对二叉树深度和高度还有点疑惑的话,请看:110.平衡二叉树 (opens new window)。

所以要找深度最大的叶子节点。

那么如何找最左边的呢?可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

1.确定递归函数的参数和返回值
参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。
本题还需要类里的两个全局变量,maxLen用来记录最大深度,result记录最大深度最左节点的数值。
2.确定终止条件
当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。
3.确定单层递归的逻辑
在找最大深度的时候,递归的过程中依然要使用回溯,代码如下:

收获:

本题涉及如下几点:
递归求深度的写法,我们在110.平衡二叉树 (opens new window)中详细的分析了深度应该怎么求,高度应该怎么求。
递归中其实隐藏了回溯,在257. 二叉树的所有路径 (opens new window)中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。
层次遍历,在二叉树:层序遍历登场! (opens new window)深度讲解了二叉树层次遍历。

题目名称:112. 路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例: 给定如下二叉树,以及目标和 sum = 22,
在这里插入图片描述

第一想法:

先求出叶子节点的路径和,再判断是否是目标和,此时需要设计回溯,使用前序遍历。

解答思路:

本题使用递归法,

  1. 首先输入为root和count,此处count采用targetsum-val的递归方式,当count为0,遍历到叶子节点时return true
  2. 终止条件为如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。
    如果遍历到了叶子节点,count不为0,就是没找到。
  3. 因为终止条件是判断叶子节点,所以递归的过程中就不要让空节点进入递归了。
    递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。

收获:

本题体现递归中的回溯隐藏在traversal(cur->left, count - cur->left->val)这里, 因为把count - cur->left->val 直接作为参数传进去,函数结束,count的数值没有改变。

题目名称:106.从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树:
在这里插入图片描述

第一想法:

首先明确中序左右中,后序中左右,观察可得后续的最后一位为根节点,对应与中序中的根节点位置,分割左右子树。再根据左右子树分割后序,同时被分割的左右子树的后序重复之前的寻找根节点的方法,实现递归。

解答思路:

1.递归传入是中序数组和后续数组,返回的是子树。
2.当后续数组为0时停止返回。
3.单层逻辑如刚才所示,进行左右数组的分割
第一步:如果数组大小为零的话,说明是空节点了。

第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。

第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点

第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)

第五步:切割后序数组,切成后序左数组和后序右数组

第六步:递归处理左区间和右区间
中序前序可同样思路,105.从前序与中序遍历序列构造二叉树

困难:

是如何切割,以及边界值找不好很容易乱套。

此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。

在切割的过程中会产生四个区间,把握不好不变量的话,一会左闭右开,一会左闭右闭,必然乱套!

收获:

主要是对前后中遍历的理解,以及根节点出现的位置,左右子树的分割。最重要的是循环不变量的确定,左闭右开左闭右闭的确定。

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值