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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值