题目
给定一个二叉树的 根节点 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
思路
找最底层的节点,也就是找深度最大的节点。找最左边的节点,可以使用前序遍历,这样优先遍历左节点。
遇到叶子节点,我们就把它的深度与原来的得到的值对应的深度比较一下,如果这个叶子节点的深度比原来的深度大,那就更新深度和值。
- 递归函数参数是树的节点,没有返回值。
- 遇到空节点时就直接返回
- 单层递归逻辑,分为两种情况:
- 左节点存在时,判断其是否为叶子节点,是的话判断深度是否满足更新条件
- 左节点不存在时,这时候才有必要判断右节点是否为叶子节点,是的话判断其深度是否满足更新条件
代码
var findBottomLeftValue = function(root) {
let res = [1 , root.val] //res[0]记录深度,res[1]记录值
let depth = 0
function traversal(node){
if(!node) return
depth++
if(node.left){
if(!node.left.left && !node.left.right && depth + 1 > res[0]){
res[0] = depth + 1
res[1] = node.left.val
}
}else if(node.right){
if(!node.right.left && !node.right.right && depth + 1 > res[0]){
res[0] = depth + 1
res[1] = node.right.val
}
}
traversal(node.left)
traversal(node.right)
depth-- //记得单层递归回退要把深度回退
}
traversal(root)
return res[1]
};
关注我的专栏,每天更新三道leetcode题解,一起变强!