力扣【二叉树专题】👊 988. 从叶结点开始的最小字符串

110 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 6 天,点击查看活动详情

题目链接

988. 从叶结点开始的最小字符串 - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给定一颗根结点为 root 的二叉树,树中的每一个结点都有一个 [0, 25] 范围内的值,分别代表字母 'a' 到 'z'。

返回 按字典序最小 的字符串,该字符串从这棵树的一个叶结点开始,到根结点结束。

注:字符串中任何较短的前缀在 字典序上 都是 较小 的:

例如,在字典序上 "ab" 比 "aba" 要小。叶结点是指没有子结点的结点。  节点的叶节点是没有子节点的节点。

测试用例

示例 1:

image.png

输入: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();
    }
};

image.png

鼓掌!单百成就达成!