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

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    """
    思路:
    第一个问题:深度优先搜索,从根节点到每一个叶子节点分别是一个路径,也就是对应到题目中的字符串
            使用的是先序遍历的思路
    第二个问题:字符串的比较问题(本题目中的0-25)其实没什么作用,只是代表着a-z的字母,


    """
    def __init__(self):
        # 定义一个类内的list 用来存储中间结果
        self.l = []

    def smallestFromLeaf(self, root: TreeNode) -> str:
        if root is None:
            return ""
        # sb 为stringbuilder的缩写
        sb = ""
        
        self.dfs(root, sb)
        return self.l[0] if self.l else ""

    def dfs(self, root, sb):
        # 将数字转化成字母,一进入函数立马构建字符串, 不管root是不是None(因为我能保证它不可能是None)
        sb += chr(root.val + 97)
        
        # 到达叶子节点
        if root.left is None and root.right is None:
            # 字符串翻转(题目要求是从叶子节点到跟节点)
            # 字符串翻转比较简单的方法是 tmp_sb = sb[::-1], 但是有的书说这样写很不专业
            tmp_sb = "".join(list(sb).reverse())
            
            # 字符串比较逻辑
            if len(self.l) != 0:
                if tmp_sb < self.l[0]:
                    self.l.clear()
                    self.l.append(tmp_sb)
            else:
                self.l.append(tmp_sb)
            return
        # 递归左子树和右子树
        if root.left:
            self.dfs(root.left, sb)
        if root.right:
            self.dfs(root.right, sb)

发布了227 篇原创文章 · 获赞 13 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_36149892/article/details/103543116