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那味了 } }