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

513.找树左下角的值

前中后序都可以,因为无中节点处理逻辑,只需要先保证遍历左节点。那么得到深度最大的节点就是最后一行最靠左侧的节点

递归法

注意最先定义的深度maxDepth=INT_MIN而不是0,否则只有一个节点的话将没法读取节点的val。
然后遍历左右节点的时候注意回溯

迭代法

简单的层序遍历,当每次循环i==0时记录结果值

112.路径总和

递归法

问:递归函数什么时候需要返回值?什么时候不需要返回值?这里总结如下三点:

  1. 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是本文下半部分介绍的113.路径总和ii)
  2. 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。 (这种情况我们在236. 二叉树的最近公共祖先 (opens new window)中介绍)
  3. 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。(本题的情况)

不涉及中节点的处理逻辑,前中后序都可
终止条件:不要去累加然后判断是否等于目标和,那么代码比较麻烦,可以用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。
如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。
如果遍历到了叶子节点,count不为0,就是没找到。

注意回溯

迭代法

此时栈里一个元素不仅要记录该节点指针,还要记录从头结点到该节点的路径数值总和。
c++就我们用pair结构来存放这个栈里的元素。
定义为:pair<TreeNode*, int> pair<节点指针,路径数值>
这个为栈里的一个元素。

113.路径总和ii

需要遍历所有路径,所以traversal函数不需要返回值。
需要一个vector<vector<int>> result存放所有路径,需要vector<int> path存放单一路径。

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

  • 第一步:如果数组大小为零的话,说明是空节点了。
  • 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
  • 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
  • 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
  • 第五步:切割后序数组,切成后序左数组和后序右数组
  • 第六步:递归处理左区间和右区间

一种方式是每层递归定定义了新的vector(就是数组),但是代码性能不好,既耗时又耗空间,但上面的代码是最好理解的。
另一种方式是用下标索引写出的代码版本:(思路是一样的,只不过不用重复定义vector了,每次用下标索引来分割)
注意: int leftPostorderEnd = postorderBegin + delimiterIndex - inorderBegin; 一定要减去inorderBegin,因为遍历右子树的时候起始下标并不为0,所以要加上delimiterIndex-inorderBegin得到的长度
int rightPostorderBegin = postorderBegin + (delimiterIndex - inorderBegin);同理

再注意函数体内,调用traversal函数,参数要填0和order.size()

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

同上面106

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值