2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。

游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡泡,但需要满足以下规则:

被击破的节点泡泡最多只能有一个子节点泡泡。

如果被击破的节点泡泡有子节点泡泡,那么这个子节点泡泡将会取代被击破泡泡的位置,也就是说,整棵以被击破泡泡为根的子树将会上移。

我们的任务是计算在进行了这样一个击破操作(或选择不击破任何节点)后,这棵二叉泡泡树的最大「层和」是多少。

这里的「层和」是指:在同一高度的所有节点泡泡的分值之和。

输入:root = [6,0,3,null,8]。

输出:11。

答案2024-04-17:

来自左程云

灵捷3.5

大体步骤如下:

1.定义节点结构体 TreeNode 和信息结构体 Info

2.定义全局变量 levelInfosjobs,分别代表每个层级的信息和待处理的节点。

3.定义作业结构体 Job,包含节点的ID和层级。

4.实现 getMaxLayerSum 函数,计算二叉泡泡树的最大层和。

5.在 getMaxLayerSum 函数中,初始化全局变量,计算树的高度。

6.遍历每个层级,计算该层级最后一个节点的分值和。

7.遍历所有待处理的节点,根据节点的ID、层级和左右边界,计算当前层级的节点和下一层级的节点。

8.根据题目描述的规则,更新最大层和的结果。

9.返回最终的最大层和。

总的时间复杂度为 O(N),其中 N 是节点的数量。

总的额外空间复杂度为 O(H),其中 H 是树的高度。

Go完整代码如下:

package main

import (
"fmt"
"math"
) type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
} type Info struct {
preSum int
left int
right int
finshId int
} var levelInfos [][]Info
var jobs []Job type Job struct {
nodeId int
level int
} func getMaxLayerSum(root *TreeNode) int {
levelInfos = nil
jobs = nil
process(root, 0)
height := len(levelInfos) - 1
ans := math.MinInt64
for level := 0; level < height; level++ {
levelList := levelInfos[level]
ans = max(ans, levelList[len(levelList)-1].preSum)
}
for id := 0; id < len(jobs); id++ {
job := jobs[id]
nodeId := job.nodeId
level := job.level
left := nodeId
right := nodeId
curLevelSum := levelInfos[level][left].preSum - levelInfos[level][left-1].preSum
for ; level < height; level++ {
if left > right {
break
}
levelList := levelInfos[level]
if right-left+1 == len(levelList)-1 {
break
}
leftInfo := levelList[left]
rightInfo := levelList[right]
nextLeft := leftInfo.left
nextRight := rightInfo.right
curLevelAll := levelList[len(levelList)-1].preSum
if leftInfo.finshId != -1 && leftInfo.finshId == rightInfo.finshId {
break
}
leftInfo.finshId = rightInfo.finshId
nextLevelSum := 0
if nextLeft <= nextRight {
nextLevelSum = levelInfos[level+1][nextRight].preSum - levelInfos[level+1][nextLeft-1].preSum
}
ans = max(ans, curLevelAll-curLevelSum+nextLevelSum)
left = nextLeft
right = nextRight
curLevelSum = nextLevelSum
}
}
return ans
} func process(cur *TreeNode, level int) bool {
if cur == nil {
return false
}
for level+1 >= len(levelInfos) {
levelInfos = append(levelInfos, []Info{{0, -1, -1, -1}})
}
levelList := levelInfos[level]
preId := len(levelList) - 1
levelList = append(levelList, Info{levelList[preId].preSum + cur.Val, len(levelInfos[level+1]), -1, -1})
levelInfos[level] = levelList
hasLeft := process(cur.Left, level+1)
hasRight := process(cur.Right, level+1)
nodeId := len(levelList) - 1
if !hasLeft || !hasRight {
jobs = append(jobs, Job{nodeId, level})
}
levelList[nodeId].right = len(levelInfos[level+1]) - 1
return true
} func max(a, b int) int {
if a > b {
return a
}
return b
} func main() {
root := &TreeNode{
Val: 6,
Left: &TreeNode{
Val: 0,
Right: &TreeNode{Val: 8},
},
Right: &TreeNode{
Val: 3,
},
}
result := getMaxLayerSum(root)
fmt.Println(result)
}

Python完整代码如下:

# -*-coding:utf-8-*-
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right class Info:
def __init__(self, preSum=0, left=-1, right=-1, finshId=-1):
self.preSum = preSum
self.left = left
self.right = right
self.finshId = finshId levelInfos = []
jobs = [] class Job:
def __init__(self, nodeId, level):
self.nodeId = nodeId
self.level = level def getMaxLayerSum(root):
global levelInfos, jobs
levelInfos = []
jobs = []
process(root, 0)
height = len(levelInfos) - 1
ans = float('-inf')
for level in range(height):
levelList = levelInfos[level]
ans = max(ans, levelList[-1].preSum)
for id in range(len(jobs)):
job = jobs[id]
nodeId = job.nodeId
level = job.level
left = nodeId
right = nodeId
curLevelSum = levelInfos[level][left].preSum - levelInfos[level][left-1].preSum
while level < height:
if left > right:
break
levelList = levelInfos[level]
if right - left + 1 == len(levelList) - 1:
break
leftInfo = levelList[left]
rightInfo = levelList[right]
nextLeft = leftInfo.left
nextRight = rightInfo.right
curLevelAll = levelList[-1].preSum
if leftInfo.finshId != -1 and leftInfo.finshId == rightInfo.finshId:
break
leftInfo.finshId = rightInfo.finshId
nextLevelSum = 0
if nextLeft <= nextRight:
nextLevelSum = levelInfos[level+1][nextRight].preSum - levelInfos[level+1][nextLeft-1].preSum
ans = max(ans, curLevelAll - curLevelSum + nextLevelSum)
left = nextLeft
right = nextRight
curLevelSum = nextLevelSum
level += 1
return ans def process(cur, level):
global levelInfos, jobs
if cur is None:
return False
while level + 1 >= len(levelInfos):
levelInfos.append([Info(0, -1, -1, -1)])
levelList = levelInfos[level]
preId = len(levelList) - 1
levelList.append(Info(levelList[preId].preSum + cur.val, len(levelInfos[level+1]), -1, -1))
hasLeft = process(cur.left, level+1)
hasRight = process(cur.right, level+1)
nodeId = len(levelList) - 1
if not hasLeft or not hasRight:
jobs.append(Job(nodeId, level))
levelList[nodeId].right = len(levelInfos[level+1]) - 1
return True root = TreeNode(6)
root.left = TreeNode(0)
root.left.right = TreeNode(8)
root.right = TreeNode(3) result = getMaxLayerSum(root)
print(result)

2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡的更多相关文章

  1. [二叉树算法]让树所有叶子节点连成一个单链表,让rchild作为 next指针

    //让树所有叶子节点连成一个单链表,让rchild作为 next指针 LNode *head=null,*pre=null;//全局变量 LNode *InOrder(BTNode *T){ if(T ...

  2. 二叉树与AVL树

    二叉树 什么是二叉树? 父节点至多只有两个子树的树形结构成为二叉树.如下图所示,图1不是二叉树,图2是一棵二叉树. 图1 普通的树                                    ...

  3. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  4. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  5. 5分钟了解二叉树之AVL树

    转载请注明出处:https://www.cnblogs.com/morningli/p/16033733.html AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多相差1.为了 ...

  6. SDUT 3340 数据结构实验之二叉树一:树的同构

    数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...

  7. 二叉树,AVL树和红黑树

    为了接下来能更好的学习TreeMap和TreeSet,讲解一下二叉树,AVL树和红黑树. 1. 二叉查找树 2. AVL树 2.1. 树旋转 2.1.1. 左旋和右旋 2.1.2. 左左,右右,左右, ...

  8. 二叉树,B树,B+树,红黑树 简介

    什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构.通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树.二叉树的子树有左右之分,并且次序不能任意颠倒.二叉树是递归定 ...

  9. 区块链中的密码学(四)- Merkle树和SPV节点

    什么是Merkle Tree? Merkle Tree 的命名来自于美国密码学家Ralph C. Merkle ,关于他的个人资料:传送门https://en.wikipedia.org/wiki/R ...

  10. 二叉树、B树、B+树、B*树、LSM树

      HBase 对于数据产品,底层存储架构直接决定了数据库的特性和使用场景.RDBMS(关系型数据库)使用 B树 及 B+树 作为数据存储结构. HBase 使用 LSM树. .     二叉树    ...

随机推荐

  1. vite 子项目 热部署 通过nginx,和父项目端口号不同,导致热更新的websocket报错的解决方案

    vite 子项目 热部署 通过nginx,和父项目端口号不同,导致热更新的websocket报错的解决方案 我的父项目端口号是8888 子项目端口号是 8013 这里报错的原因就是,热更新的webso ...

  2. aardio 嵌入 其他应用程序

    aardio 嵌入 其他应用程序 需求 这个chrome壳不能进行拖拽和缩放,所以再套一个壳,可以再分屏的时候用 import win.ui; /*DSG{{*/ winform = win.form ...

  3. day34-IO流01

    IO流01 1.文件基础知识 什么是文件? 文件,我们并不陌生.文件是保存数据的地方.比如大家经常使用的word文档,txt文件,excel文件等,都是文件.它既可以保存一张图片,也可以保存声音.视频 ...

  4. grails中使用render方法输出XML总结

    GrailsXMLJava 1.首先看看简单的XML生成情况 Java代码  收藏代码 <images>        <image title="one" /& ...

  5. 安装YCM

    安装Vundle git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim Vundle也是vim的 ...

  6. 分析项目中ANR问题

    简介 之前接手的老项目,从接手到现在也没怎么去维护过,突然测试那边给我提了一个ANR的BUG,由于从别人手中接手,并且此项目也不是经常需要维护,所有对项目代码并不是特别熟悉,因此解决此问题还是比较麻烦 ...

  7. 3D渲染速度慢,花重金买显卡还是用云渲染更划算

    3D渲染对建筑师和设计师来说并不陌生,3D渲染的过程中出现渲染卡顿.特殊材质难以渲染,或者本地配置不足.本地渲染资源不够时,常常会影响工作效率.本文比较了3D渲染时,为提高工作效率,买显卡还是用云渲染 ...

  8. Android线程池封装库

    目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...

  9. Counts the number of the messages received and sent

    我的博客园:https://www.cnblogs.com/CQman/ 本文版权归CQman和博客园共有,欢迎转载,但必须保留此段声明,并给出原文链接,谢谢合作. Symptom  Counts t ...

  10. TP6框架--EasyAdmin学习笔记:定义路由

    这是我写的学习EasyAdmin的第二章,这一章我给大家分享下如何定义一条路由 正常的tp6定义路由方法如下: /route/admins/app.php 文件内容 //路由变量自定义 Route:: ...