题目:
给定一个二叉树,在树的最后一行找到最左边的值。
示例 1:
示例 2:
题解:
1.递归
步骤:
1.确定递归函数的参数和返回值
参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。
本题还需要类里的两个全局变量,maxLen用来记录最大深度,maxleftValue记录最大深度最左节点的数值。
如果需要遍历整棵树,递归函数就不能有返回值。如果需要遍历某一条固定路线,递归函数就一定要有返回值!
2.确定终止条件
当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。
3.确定单层递归的逻辑
在找最大深度的时候,递归的过程中依然要使用回溯,左子树找完再找右子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int maxLen = -1;
int maxLeftValue = 0;
public int findBottomLeftValue(TreeNode root) {
maxLeftValue = root.val;
findBottomLeft(root, 0);
return maxLeftValue;
}
public void findBottomLeft(TreeNode root, int leftLen) {
if (root.left == null && root.right == null) { //遇到叶子节点
if (leftLen > maxLen) {
maxLen = leftLen; //更新最大深度
maxLeftValue = root.val; //最大深度最左边的数值
}
}
if (root.left != null) {
findBottomLeft(root.left, leftLen + 1); /回溯,leftLen返回后没变
}
if (root.right != null) {
findBottomLeft(root.right, leftLen + 1);
}
}
}
参考:代码随想录