「这是我参与2022首次更文挑战的第 23 天,活动详情查看:2022首次更文挑战」
题目链接
513. 找树左下角的值 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
测试用例
示例 1:
输入: root = [2,1,3]
输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7
题目分析
题目需要我们求一个二叉树中,最下面一层的左边第一个节点的值
对应这种类型的题目,常规的对树进行递归遍历,无法找到满足要求的节点。最佳的办法是一层层的遍历二叉树。使用一个变量+标记来记录当前层的左侧第一个节点的值。当遍历到下一层时,对变量进行覆盖赋值(由于树的结构的特性,只有在完整的遍历完一层后,才会知道下一层该遍历的节点),当完整的遍历了二叉树后,就能获取并返回题目需要的值
代码实现
var findBottomLeftValue = function(root) {
let nodes = [root],
len = nodes.length;
let leftVal = root.val;
while (len > 0) {
let flag = true;
for (; len > 0; len--) {
let curr = nodes.shift();
if (flag) {
leftVal = curr.val;
flag = false;
}
if (curr.left != null) nodes.push(curr.left);
if (curr.right != null) nodes.push(curr.right);
}
len = nodes.length;
}
return leftVal;
};
解法 2
以示例2 来演示前序遍历
我们使用两个变量,val 表示节点的值, deep 表示值在树中的深度。根据二叉树前序遍历的特性,相同深度的节点,第一次遍历到的时候,一定是最左侧的值,我们只需要记录下来最大的深度第一个得到的值即可
代码实现如下:
var findBottomLeftValue = function(root) {
let deep = 1,
val = root.val;
trave(root, 1);
return val;
function trave(node, d) {
if (node == null) return;
d++;
if (d > deep) {
val = node.val;
deep = d;
}
trave(node.left, d);
trave(node.right, d);
}
}
两种解法性能看着差不多,但递归的方式用到了二叉树遍历的特性,存在一定的局限性