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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 988. 从叶结点开始的最小字符串

本题来自 LeetCode:988. 从叶结点开始的最小字符串[1]

题目描述

给定一颗根结点为  root  的二叉树,书中的每个结点都有一个从  0 到  25  的值,分别代表字母  ‘a’ 到  ‘z’:值  0 代表  ‘a’,值  1  代表  ‘b’,依此类推。
找出按字典序最小的字符串,该字符串从这棵树的一个叶结点开始,到根结点结束。
(小贴士:字符串中任何较短的前缀在字典序上都是较小的:例如,在字典序上  “ab” 比  “aba”  要小。叶结点是指没有子结点的结点。)
示例 1:


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

示例 2:


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

示例 3:


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

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

题目分析

本题和类似,需要遍历整个二叉树,计算出所有根节点到叶子节点的路径,不同是这个需要计算出叶子节点到根节点的路径,这里采用头插法即可。

题目解答


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public String smallestFromLeaf(TreeNode root) {
        if(root == null) {
            return null;
        }
        return dfs(root, "");
    }

    public String dfs(TreeNode root, String path) {
        path = getLowAlphabet(root.val) + path;

        //  该节点为叶子节点
        if(root.left == null && root.right == null) {
            return path;
        }

        // 左子二叉树的最小字符串
        String leftPath = null;
        if(root.left != null) {
            leftPath = dfs(root.left, path);
        }
        // 右子二叉树的最小字符串
        String rightPath = null;
        if(root.right != null) {
            rightPath = dfs(root.right, path);
        }
        // 左子二叉树为空
        if(leftPath == null) {
            return rightPath;
        }
        // 右子二叉树为努力了
        if(rightPath == null) {
            return leftPath;
        }
        // 比较左、右二叉树的最小字符串
        return leftPath.compareTo(rightPath)  0 ? leftPath : rightPath;
    }

    public String getLowAlphabet(int val) {
        return String.valueOf(((char)(val + 'a')));
    }
}

复杂度分析:
时间复杂度: O(n),遍历每个节点
空间复杂度: O(n),每个节点会创建一个字符串

参考资料

  1. 从叶结点开始的最小字符串: https://leetcode-cn.com/problems/smallest-string-starting-from-leaf

原文始发于微信公众号(xiaogan的技术博客):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 988. 从叶结点开始的最小字符串


 上一篇
124. 二叉树中的最大路径和 124. 二叉树中的最大路径和
本题来自 LeetCode:124. 二叉树中的最大路径和[1] 题目描述给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1: 输入:
2021-04-05
下一篇 
整数反转相关题型 整数反转相关题型
7. 整数反转本题来自 LeetCode:7. 整数反转[1] 题目描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例  1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -32
2021-04-05