(C卷,100分)- 悄悄话(Java & JS & Python & C)

题目描述

给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。

初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。

输入描述

给定二叉树

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
说明

题目解析

题目给的输入信息对照图示来看,应该就是二叉树的层序遍历序列,如下图所示:

层序遍历序列中,父子节点存在如下关系:

如果父节点在序列中的索引是k,则其两个子节点在序列中的索引分别为 2k+1, 2k+2

因此,我们就无需建树操作了。

而悄悄话的传递,其实父节点将自身得到消息的时延累加到其各个子节点上,最终叶子节点中最大的时延值就是:二叉树所有节点上的人都接收到悄悄话花费的时间

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const times = (await readline()).split(" ").map(Number);

  // 记录题解
  let ans = 0;

  // 根节点的索引是0
  const queue = [0];
  while (queue.length > 0) {
    const fa = queue.shift(); // 父节点索引

    const ch1 = 2 * fa + 1; // 左子节点索引
    const ch2 = 2 * fa + 2; // 右子节点索引

    // fa是否存在左子节点
    const ch1_exist = ch1 < times.length && times[ch1] != -1;
    // fa是否存在右子节点
    const ch2_exist = ch2 < times.length && times[ch2] != -1;

    // fa如果存在左子节点
    if (ch1_exist) {
      times[ch1] += times[fa];
      queue.push(ch1);
    }

    // fa如果存在右子节点
    if (ch2_exist) {
      times[ch2] += times[fa];
      queue.push(ch2);
    }

    // fa是叶子节点
    if (!ch1_exist && !ch2_exist) {
      // 保留叶子节点中最大时延
      ans = Math.max(ans, times[fa]);
    }
  }

  console.log(ans);
})();

 

Java算法源码

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int[] times = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    // 记录题解
    int ans = 0;

    // 根节点的索引是0
    LinkedList<Integer> queue = new LinkedList<>();
    queue.addLast(0);

    while (queue.size() > 0) {
      int fa = queue.removeFirst(); // 父节点索引

      int ch1 = 2 * fa + 1; // 左子节点索引
      int ch2 = 2 * fa + 2; // 右子节点索引

      // fa是否存在左子节点
      boolean ch1_exist = ch1 < times.length && times[ch1] != -1;
      // fa是否存在右子节点
      boolean ch2_exist = ch2 < times.length && times[ch2] != -1;

      // fa如果存在左子节点
      if (ch1_exist) {
        times[ch1] += times[fa];
        queue.addLast(ch1);
      }

      // fa如果存在右子节点
      if (ch2_exist) {
        times[ch2] += times[fa];
        queue.addLast(ch2);
      }

      // fa是叶子节点
      if (!ch1_exist && !ch2_exist) {
        // 保留叶子节点中最大时延
        ans = Math.max(ans, times[fa]);
      }
    }

    System.out.println(ans);
  }
}

 

Python算法源码

# 输入获取
times = list(map(int, input().split()))


# 算法入口
def getResult():
    # 记录题解
    ans = 0

    # 根节点的索引是0
    queue = [0]
    while len(queue) > 0:
        fa = queue.pop(0)  # 父节点索引

        ch1 = 2 * fa + 1  # 左子节点索引
        ch2 = 2 * fa + 2  # 右子节点索引

        # fa是否存在左子节点
        ch1_exist = ch1 < len(times) and times[ch1] != -1
        # fa是否存在右子节点
        ch2_exist = ch2 < len(times) and times[ch2] != -1

        # fa如果存在左子节点
        if ch1_exist:
            times[ch1] += times[fa]
            queue.append(ch1)

        # fa如果存在右子节点
        if ch2_exist:
            times[ch2] += times[fa]
            queue.append(ch2)

        # fa是叶子节点
        if not ch1_exist and not ch2_exist:
            # 保留叶子节点中最大时延
            ans = max(ans, times[fa])

    return ans


# 算法调用
print(getResult())

C算法源码

#include <stdio.h>
#include <stdlib.h>

#define MAX(a,b) ((a) > (b) ? (a) : (b))

#define MAX_SIZE 10000

typedef struct ListNode {
    int ele;
    struct ListNode *next;
} ListNode;

typedef struct LinkedList {
    int size;
    ListNode *head;
    ListNode *tail;
} LinkedList;

LinkedList *new_LinkedList() {
    LinkedList *link = (LinkedList *) malloc(sizeof(LinkedList));
    link->size = 0;
    link->head = NULL;
    link->tail = NULL;
    return link;
}

void addLast_LinkedList(LinkedList *link, int ele) {
    ListNode *listNode = (ListNode *) malloc(sizeof(ListNode));
    listNode->ele = ele;
    listNode->next = NULL;

    if(link->size == 0) {
        link->head = listNode;
        link->tail = listNode;
    } else {
        link->tail->next = listNode;
        link->tail = listNode;
    }

    link->size++;
}

int removeFirst_LinkedList(LinkedList* link) {
    if(link->size == 0) exit(-1);

    ListNode* removed = link->head;

    if(link->size == 1) {
        link->head = NULL;
        link->tail = NULL;
    } else {
        link->head = link->head->next;
    }

    link->size--;

    int res = removed->ele;

    free(removed);

    return res;
}

int main() {
    int times[MAX_SIZE];
    int times_size = 0;

    while (scanf("%d", &times[times_size++])) {
        if(getchar() != ' ') break;
    }

    // 记录题解
    int ans = 0;

    // 根节点的索引是0
    LinkedList* queue = new_LinkedList();
    addLast_LinkedList(queue, 0);

    while (queue->size > 0) {
        int fa = removeFirst_LinkedList(queue); // 父节点索引

        int ch1 = 2 * fa + 1; // 左子节点索引
        int ch2 = 2 * fa + 2; // 右子节点索引

        // fa是否存在左子节点
        int ch1_exist = ch1 < times_size && times[ch1] != -1;
        // fa是否存在右子节点
        int ch2_exist = ch2 < times_size && times[ch2] != -1;

        // fa如果存在左子节点
        if(ch1_exist) {
            times[ch1] += times[fa];
            addLast_LinkedList(queue, ch1);
        }

        // fa如果存在右子节点
        if(ch2_exist) {
            times[ch2] += times[fa];
            addLast_LinkedList(queue, ch2);
        }

        // fa是叶子节点
        if(!ch1_exist && !ch2_exist) {
            // 保留叶子节点中最大时延
            ans = MAX(ans, times[fa]);
        }
    }

    printf("%dn", ans);

    return 0;
}

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?