leetcode_988 从叶结点开始的最小字符串

128 阅读1分钟

要求

给定一颗根结点为 root 的二叉树,树中的每一个结点都有一个从 0 到 25 的值,分别代表字母 'a' 到 'z':值 0 代表 'a',值 1 代表 'b',依此类推。

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

(小贴士:字符串中任何较短的前缀在字典序上都是较小的:例如,在字典序上 "ab" 比 "aba" 要小。叶结点是指没有子结点的结点。)

示例 1:

image.png

输入:[0,1,2,3,4,3,4]
输出:"dba"

示例 2:

image.png

输入:[25,1,3,1,3,0,2]
输出:"adz"

示例 3:

image.png

输入:[2,2,1,null,1,0,null,0]
输出:"abc"

提示:

  • 给定树的结点数介于 1 和 8500 之间。
  • 树中的每个结点都有一个介于 0 和 25 之间的值。

核心代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def smallestFromLeaf(self, root: Optional[TreeNode]) -> str:
        self.res = "~"
        self.dfs(root,"")
        return self.res

    def dfs(self,root,path):
        if not root:
            return 
        path = chr(root.val + 97) + path
        if not root.left and not root.right:
            self.res = min(self.res,path)
        self.dfs(root.left,path)
        self.dfs(root.right,path)

image.png

解题思路:实际上就是深度优先遍历,留下一个历史最佳的path,每个新path都和历史最佳path相比,小则留下,不断遍历最终留存下最小的路径,使用~表示比z大的字符串。