给定一颗根结点为 root
的二叉树,书中的每个结点都有一个从 0
到 25
的值,分别代表字母 'a'
到 'z'
:值 0
代表 'a'
,值 1
代表 'b'
,依此类推。
找出按字典序最小的字符串,该字符串从这棵树的一个叶结点开始,到根结点结束。
(小贴士:字符串中任何较短的前缀在字典序上都是较小的:例如,在字典序上 “ab” 比 “aba” 要小。叶结点是指没有子结点的结点。)
解答:
深度优先遍历
class Solution {
TreeSet<String> set = new TreeSet<>();
public String smallestFromLeaf(TreeNode root) {
if (root == null) return "";
dfs(root, "");
return (String) set.toArray()[0];
}
private void dfs(TreeNode root, String str) {
str = ((char) (root.val + 97)) + str;
if (root.left == null && root.right == null) {
set.add(str);
return;
}
if (root.left != null) {
dfs(root.left, str);
}
if (root.right != null) {
dfs(root.right, str);
}
}
}
UWI思路也是这个
class Solution {
String ret = "~";
public String smallestFromLeaf(TreeNode root) {
dfs(root, "");
return ret;
}
void dfs(TreeNode cur, String s)
{
if(cur == null)return;
s = (char)('a'+cur.val) + s;
if(cur.left == null && cur.right == null){
if(s.compareTo(ret) < 0){
ret = s;
}
}
dfs(cur.left, s);
dfs(cur.right, s);
}
}