一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 6 天,点击查看活动详情。
题目链接
988. 从叶结点开始的最小字符串 - 力扣(LeetCode) (leetcode-cn.com)
题目描述
给定一颗根结点为 root 的二叉树,树中的每一个结点都有一个 [0, 25] 范围内的值,分别代表字母 'a' 到 'z'。
返回 按字典序最小 的字符串,该字符串从这棵树的一个叶结点开始,到根结点结束。
注:字符串中任何较短的前缀在 字典序上 都是 较小 的:
例如,在字典序上 "ab" 比 "aba" 要小。叶结点是指没有子结点的结点。 节点的叶节点是没有子节点的节点。
测试用例
示例 1:
输入:root = [0,1,2,3,4,3,4]
输出:"dba"
限制
给定树的结点数在 [1, 8500] 范围内
0 <= Node.val <= 25
题目分析
由题目得知,树的节点的值为 [0, 25],即依次表示 [a, z] 26 个字母
题目需要我们从所有的,从叶子节点到根节点的路径中,选择出一条最小值的路径;将节点的值用字母替换后,从叶子节点到根节点的值一次拼接为一个字符串,我们需要比较拿到字典排序最小的那个即可
在 js 中,两个字符串的直接比较的依据就是根据其字典排序大小
一个最简单的实现为,对这棵树进行先序遍历,使用一个数组 arr 变量,在遍历到节点时,值对应的字母存入到数组;遍历完此节点的左右子节点后,判断这个是否为叶子节点,若是,则对数组的值拼接为字符串直接比较,记录下最小值;
并且,在遍历完叶子节点后,需要从 arr中弹出此节点的值!! 此项操作的目的在于,保证在进行最小值比较的时候, arr 存放的值即为根节点到叶子节点的路径!
代码实现
使用 String.fromCharCode 快速将 ascll 码转化为我们需要的小写字母数组
然后,就是对树进行深度遍历即可
递归当前节点的左右子节点之前记录值;之后判断+弹出值
var smallestFromLeaf = function(root) {
let nums = new Array(26).fill(0).map((n, i) => String.fromCharCode(97 + i));
let arr = [];
let min;
trave(root);
return min.join('');
function trave(node) {
if (node == null) return;
arr.unshift(nums[node.val]);
trave(node.left);
trave(node.right);
if (node.left == null && node.right == null) {
if (min == null) {
min = arr.join('');
} else {
let temp = arr.join('')
if (min > temp) {
min = temp;
}
}
}
arr.shift();
}
};
鼓掌!单百成就达成!