点赞再看,养成习惯!

题目描述

输入一个字符串,代表一颗二叉树,如"2(1,2(0,1)",树结构如下:

规则就是:1.某结点的子结点就用括号括起来并用逗号隔开;2.只有一个子结点,另一个为空,那就用0表示;3.一个子结点都没有,也就没有括号。
然后,在树中找出最大的路段和,路段指的是从根结点到叶子结点的路径中的一段(可以包含根节点)权值和。

解题方案

解题思路

1.根据输入的字符串构造出二叉树;
给定的字符串其实是用广义表表示的二叉树,第一步要解决的问题就是如何转换广义表为对应的二叉树
2.递归+动态规划来求出最大路段和。
这个很类似力扣上求二叉树的最大路径和,有所区别的是路段不会是两个叶子结点之间的路径,所以稍微修改最大路径和的解决方法即可解决这个问题。

py代码

def buildTreeFromGenList(arr):'''转化广义表为对应的二叉树:param arr: 广义表对应有效字符组成的数组:return: 二叉树的根结点'''stack = []k = -1for i in range(len(arr)):if arr[i] == '(':k = 0stack.append(arr[i])elif arr[i] == ',':k = 1elif arr[i] == ')':stack.pop()else:if arr[i] == '0':node = Noneelse:node = TreeNode(int(arr[i]))if k == -1:stack.append(node)elif k == 0:stack.pop()stack[-1].left = nodestack.append(node)elif k == 1:stack.pop()stack[-1].right = nodestack.append(node)return stack[-1]def max_gain(node):'''求取最大路段和:param node: 二叉树的根结点:return: 包含node的最大路段和'''global max_sumif not node:return 0left_gain = max(max_gain(node.left), 0)right_gain = max(max_gain(node.right), 0)price_newpath = max(left_gain, right_gain) + node.valmax_sum = max(max_sum, price_newpath)return node.val + max(left_gain, right_gain)if __name__ == '__main__':'''测试用例:22(0,1)2(1,2(0,1))1(-2(3,-4),5(-6,7))对应输出:23513'''line = input()if not line:print(0)# 1.转化字符串为有效字符的组合arr = []  # 存储字符串转化来的有效字符组合的数组i, j = 0, 1while i < len(line):while j < len(line) and line[j].isdigit():j += 1arr.append(line[i:j])if j<len(line):arr.append(line[j])if j + 1 < len(line) and (line[j + 1] == ',' or line[j + 1] == ')'):arr.append(line[j + 1])i = j + 2else:i = j + 1j = i + 1# 2.根据广义表构造二叉树root = buildTreeFromGenList(arr)max_sum = float('-inf')# 3.求取最大路段和max_gain(root)print(max_sum)

时间复杂度为O(N),N为字符串的长度。

参考文献

1.https://blog.csdn.net/alex1997222/article/details/82944763(广义表转化为二叉树的博客)
2.https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/(二叉树的最大路径和)

觉得不错,就点个赞吧!

5.6日华为笔试第三题解法相关推荐

  1. 2021 8.8拼多多笔试第三题解答

    第三题输出括号匹配  输入包含 "( ) L R D " 题目以后补充.... import java.util.Arrays; import java.util.Scanner; ...

  2. 2021.8.12携程笔试第三题:建树游戏DFS

    2021.8.12携程笔试 讨论区 在做最后一题的时候把题意看错了,悔之莫及,故记录此文引以为戒! 建树游戏 问题描述 有n个节点和n-1条边,形成一棵树,每个节点有一个权值.把其中一条边删除就形成了 ...

  3. 联通软研院2020年球季校招笔试第三题 20190916

    问题描述:小明有5个歌单,编号分别为A.B.C.D.E,每个歌单有3首不同的歌,现在他想要一个程序,当他输入一些歌单的名称的时候,每个歌单中输出一首歌到播放列表,并输出所有满足条件的播放列表. 输入: ...

  4. 2020年联通软件研究院校招笔试第三题

    题目描述: 解题思路: 直接从50元开始尝试,然后尝试10元,再然后5元,再然后一元. 然后处理小数部分. 解题代码: import java.util.Scanner;public class Ma ...

  5. 2020年快手校招JAVA岗笔试第三题

    题目描述: 将两个内容合并,每次,取第一行四个,取第二行5个.把多余的直接补在最后即可. 解题代码 import java.util.Scanner;public class Main_3 {publ ...

  6. 华为2019春招留学生笔试第三题python

    输入数字转化成对应的excel表值 1 -> a 2 -> b 3 -> c ... 26 -> z 27 -> aa 28 -> ab 思路:10进制转换为26进 ...

  7. 华子20221012笔试第三题

    小明在工作中经常碰到各种进制数据的四则计算,他决定要写一个程序来支持多进制计算.这个计算器要支持+,-,*,/,(,),另外可以通过设置进制值来支持从2~16进制的加减乘除 不考虑超大数场景. 解答要 ...

  8. 用友2020校招java笔试题_2020年快手校招JAVA岗笔试第三题-Go语言中文社区

    题目描述: 将两个内容合并,每次,取第一行四个,取第二行5个.把多余的直接补在最后即可. 解题代码 import java.util.Scanner; public class Main_3 { pu ...

  9. 华为20190410研发笔试第三题:求两点之间的路径数

    [题目描述]   在一张NXM的地图上,每个点的海拔高度不同,从当前点只能访问上下左右四个点中还没有到达过的点,且下一步的选择的点的海拔高度必须高于当前的点:求从地图中的点A到点B的总的路径数量除以1 ...

最新文章

  1. 大三Java后端暑期实习面经总结——Java容器篇
  2. Jenkins X:基于Kubernetes的CI/CD平台
  3. jquery 操作css 选择器
  4. java函数调用约定_2020-09-04:函数调用约定了解么?
  5. 回溯算法之全排列问题
  6. gulp常用组件【study笔记】
  7. PHP自己实现var_dump函数
  8. S一文读懂应力集中与应力奇异
  9. Excel数据去重(删除重复项)
  10. Linux常见系统故障排除
  11. Masked Siamese Networksfor Label-Efficient Learning
  12. 基于rancheros离线安装Habor以及Rancher
  13. mathematica求定积分和不定积分
  14. Googlenet v1、v2、v3、v4区别
  15. Glide-通过Modules定制Glide
  16. http://dev.firnow.com/course/3_program/java/javashl/200726/11199.html
  17. 阿噗啊噗服务器维护,这些App我能笑一年!阿噗整理的20个奇葩App,没玩过你就OUT了!...
  18. 对可变性与不可变性的总结
  19. html图片重叠怎么实现,css如何实现图片堆叠效果
  20. #include <filename> 和 #include “filename“ 有什么区别?

热门文章

  1. php处理预占库存,装配类产品排单研究 — 库存,在制和预占
  2. CentOS7-Docker 网络-06
  3. angular获取手机验证码
  4. python 小爱音箱集成_与小米AI音箱同样的功能,这款小爱音箱mini值吗?
  5. 光触媒(TiO2)的近代发展三部曲
  6. 需求挖掘:产品经理怎么基于项目做需求挖掘
  7. SmartGit 常见错误提示代码
  8. c语言程序设计作业word版,c语言程序设计Word版
  9. 用PS对图片进行描摹
  10. 互联网江湖的绝世武功——“独孤九剑”