lexicographically smallest string 是这道题目的关键。
翻译过来,就是字典序最小。也就是你翻字典的时候的顺序最小。
从根到root的所有node拼接的string 就按照递归来做。思路也是divide and conquer。
求字典序最小才是这道题的关键,换言之就是实现strcmp函数。
strcmp一个个的字符按照字典顺序比较A,B
如果A[i] 字符比B[i] 小,那A 的字典序小于B。
如果A[i]字符比B[i]大,那A的字典序大于B。
如果A[i]字符和B[i] 一样。如果A的长度小于B,那A的字典序小于B。
以下是实现strcmp的代码。
int size = min(sl.length(), curStr.length());
for(int i=0;i<size;i++){
if(sl[i]> curStr[i]){
sl=curStr;
return;
}
else if(sl[i] < curStr[i])
return;
}
if(sl.length() > curStr.length())
sl = curStr;
return;
}
实现了strcmp,那这个问题就迎刃而解了。
直接divide and conquer
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
string sl="";
void help(TreeNode* root, string curStr) {
if(root->left == nullptr && root->right == nullptr) {
char tmp = 'a' + root->val;
curStr = tmp + curStr;
if(sl == "")
sl = curStr;
int size = min(sl.length(), curStr.length());
for(int i=0;i<size;i++){
if(sl[i]> curStr[i]){
sl=curStr;
return;
}
else if(sl[i] < curStr[i])
return;
}
if(sl.length() > curStr.length())
sl = curStr;
return;
}
char tmp = 'a' + root->val;
int base=1;
if(root->left != nullptr)
help(root->left, tmp + curStr);
if(root->right != nullptr)
help(root->right, tmp + curStr);
}
string smallestFromLeaf(TreeNode* root) {
if(root == nullptr)
return "";
help(root, "");
return sl;
}
};