二叉树(3)
递归三步曲:
- 确定递归函数的参数和返回类型
- 确定终止条件
- 确定单层递归的逻辑
404. 左叶子之和 - 力扣(LeetCode) (leetcode-cn.com)
给定二叉树的根节点 root
,返回所有左叶子之和。
1 | //递归法 |
1 | //迭代法, 先序遍历,(不是必须先序遍历,中左右和中右左均可) |
112. 路径总和 - 力扣(LeetCode) (leetcode-cn.com)
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
1 | //递归法 |
1 | //迭代法,注意为了同时保存树的节点和其值使用了pair,计算每条路径的值求和如果等于target就返回true,否则返回false。 |
513. 找树左下角的值 - 力扣(LeetCode) (leetcode-cn.com)
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
层序遍历,只需要在循环时每次都记录第一个元素的值,最后result就会被最后一行的第一个元素值覆盖。
1 | //迭代法 |
如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。那么如果找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。
递归函数的返回值问题:如果需要遍历整棵树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!
此题要找最深的叶子节点,需要遍历整棵树,因此递归函数不能有返回值。
1 | /** |
113. 路径总和 II - 力扣(LeetCode) (leetcode-cn.com)
1 | /** |
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
- 第一步:如果数组大小为零的话,说明是空节点了。
- 第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
- 第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
- 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
- 第五步:切割后序数组,切成后序左数组和后序右数组
- 第六步:递归处理左区间和右区间
1 | /** |
654. 最大二叉树 - 力扣(LeetCode) (leetcode-cn.com)
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从nums
递归地构建:
创建一个根节点,其值为 nums
中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums
构建的 最大二叉树 。
1 | /** |