题目描述
给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。
初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。
输入描述
给定二叉树
0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
注:-1表示空节点
输出描述
返回所有节点都接收到悄悄话花费的时间
38
用例
输入 | 0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2 |
---|---|
输出 | 38 |
说明 | 无 |
解题思路
- 读取输入:
- 读取一行输入,这行输入包含了一系列的整数,每个整数代表从父节点到子节点的悄悄话传递时间。
- 处理根节点:
- 将根节点(索引为0)加入队列,并设置其悄悄话接收时间为0。
- 层次遍历:
- 当队列不为空时,循环执行以下步骤:
- 从队列中取出一个节点(包括节点索引和该节点的悄悄话接收时间)。
- 计算左右子节点的索引。
- 检查左右子节点是否存在(索引有效且不为-1)。
- 当队列不为空时,循环执行以下步骤:
- 更新子节点时间:
- 如果子节点存在,将当前节点的悄悄话接收时间加上从当前节点到子节点的悄悄话传递时间,得到子节点的悄悄话接收时间。
- 将子节点及其悄悄话接收时间加入队列。
- 更新最大时间:
- 每次子节点的悄悄话接收时间被计算后,更新最大时间为当前子节点时间和已记录的最大时间中的较大值。
模拟计算
给定的输入数组0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
代表一棵二叉树,其中每个值代表从父节点到子节点的悄悄话传递时间。数组中的-1
表示没有子节点。数组索引代表节点的顺序,按照完全二叉树的顺序排列。
模拟计算过程如下:
-
初始化队列:
- 将根节点索引
0
加入队列,此时队列为[0]
。
- 将根节点索引
-
开始层次遍历:
- 队列非空,继续遍历。
-
处理根节点:
- 取出队列头部元素(根节点索引
0
),队列变为[]
。 - 计算左子节点索引
1
(2*0+1
),右子节点索引2
(2*0+2
)。 - 左子节点值为
9
,更新为0+9=9
,加入队列,队列变为[1]
。 - 右子节点值为
20
,更新为0+20=20
,加入队列,队列变为[1, 2]
。 - 更新
maxTime
为
- 取出队列头部元素(根节点索引