Given the root of a binary tree, each node has a value from 0 to 25 representing the letters ‘a’ to ‘z’: a value of 0 represents ‘a’, a value of 1 represents ‘b’, and so on.

Find the lexicographically smallest string that starts at a leaf of this tree and ends at the root.

(As a reminder, any shorter prefix of a string is lexicographically smaller: for example, “ab” is lexicographically smaller than “aba”. A leaf of a node is a node that has no children.)

题目意思很好理解 就是虽然树中的值是数字 但是却代表字母 我们要找出一条字典序最小的路径,注意这里的路径指的是从叶子节点到根节点
输出那个最小的字典序字符串。a0 b1

首先想暴力解法 我们可以把这个问题分为两个部分 第一部分是遍历所有的路径(怎么遍历?DFS)第二部分是维护一个字典序最小的路径 至于如何比较两个字符串字典序?直接str1.compareTo(str2)即可 如果小于0,则说明str1字典序比较小。

所以还是要的得到所有的路径 之前我们遇到过输出所有路径的问题,当然现在要求倒序 那怎么办?这里就不要心那么死,直接正常输出然后倒序一下就行了。

class Solution {
    String ans = "~"; //global minimum,因为之后涉及到字符串之间的比较 所以这里要初始化为一个大于z 这里的"~"是126
    public String smallestFromLeaf(TreeNode root) {
        if (root == null) return "";
        dfs(root, new StringBuilder());
        return ans;
    }
    
    private void dfs(TreeNode node, StringBuilder sb) {
        if (node == null) return;
        sb.append((char)('a' + node.val));
        
        if (node.left == null && node.right == null) { //if node reached the leaf
            sb.reverse(); //
            String S = sb.toString();
            sb.reverse(); //reverse back because we are gonna need it later
            
            if (S.compareTo(ans) < 0) {
                ans = S; //update minimum
            }
        }
        dfs(node.left, sb);
        dfs(node.right, sb);
        sb.deleteCharAt(sb.length() - 1);//有backtracking那味了
    }
}