【秋招笔试】8.11大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试

💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导

✨ 本系列打算持续跟新 春秋招笔试题

👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸

✨ 笔试合集传送们 -> 🧷春秋招笔试合集

🍒 本专栏已收集 50+套笔试题,笔试真题 会在第一时间跟新

🍹 近期会进行一波价格调整,没订阅的朋友抓紧冲!!!

alt

🪔 大疆的秋招第一场笔试,来啦!!!

🍥 大疆有很多套卷,每套卷子有 0/1/2 道编程题,题目内容不一定相同,这样 选择题、填空、问答 的比重就占很大了。

🌈 本题为力扣的一道 hard 的改编题,但原本的题目描述有问题,主要做法为树形DP

🍈 01.二叉树路径中的最大值

问题描述

在一棵二叉树中,路径被定义为一条节点序列,序列中的每对相邻节点之间都用一条边连接。同一个节点在一条路径中至多出现一次。路径至少包含一个节点,且不一定经过根节点。

路径和是指路径中所有节点值的总和。

给定一棵二叉树的根节点 ,请计算并返回这棵树的最大路径和。

输入格式

输入为一个数组,表示以先序遍历顺序给出的二叉树节点值。

输出格式

输出一个整数,表示二叉树的最大路径和。

样例输入

[1,2,3,4,5]

样例输出

11

数据范围

  • 二叉树的节点数不超过
  • 节点的值范围为

题解

题目应该是给的层序遍历,只给定先序遍历是确定不了一颗树的,无法做。

力扣原题改编:124. 二叉树中的最大路径和

本题的核心思想基于树形DP。

对于每个节点,我们需要计算两个值:

  1. 包含该节点的最大路径和(可能是单边路径)。
  2. 经过该节点的最大路径和(可能是跨越左右子树的路径)。

递归过程中,我们自底向上计算这两个值。对于每个节点:

  1. 计算左右子树的最大路径和。
  2. 计算包含当前节点的最大路径和(节点值加上左右子树中较大的路径和,如果都是负数则不选)。
  3. 更新全局最大路径和(考虑跨越左右子树的路径)。

时间复杂度为 ,其中 是二叉树的节点数。

参考代码

  • Python
# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def maxPathSum(self, root: TreeNode) -> int:
        # 初始化最大路径和为负无穷
        self.max_sum = float('-inf')
        
        def max_gain(node):
            if not node:
                return 0
            
            # 递归计算左右子树的最大贡献值
            left_gain = max(max_gain(node.left), 0)
            right_gain = max(max_gain(node.right), 0)
            
            # 计算包含当前节点和左右子树的路径和
            price_newpath = node.val + left_gain + right_gain
            
            # 更新最大路径和
            self.max_sum = max(self.max_sum, price_newpath)
            
            # 返回节点的最大贡献值
            return node.val + max(left_gain, right_gain)
        
        max_gain(root)
        return self.max_sum

# 处理输入
def stringToTreeNode(input):
    input = input.strip()
    input = input[1:-1]
    if not input:
        return None

    inputValues = [s.strip() for s in input.split(',')]
    root = TreeNode(int(inputValues[0]))
    nodeQueue = [root]
    front = 0
    index = 1
    while index < len(inputValues):
        node = nodeQueue[front]
        front = front + 1

        item = inputValues[index]
        index = index + 1
        if item != "null":
            leftNumber = int(item)
            node.left = TreeNode(leftNumber)
            nodeQueue.append(node.left)

        if index >= len(inputValues):
            break

        item = inputValues[index]
        index = index + 1
        if item != "null":
            rightNumber = int(item)
            node.right = TreeNode(rightNumber)
            nodeQueue.append(node.right)
    return root

# 主函数
if __name__ == "__main__":
    line = input()
    root = stringToTreeNode(line)
    
    solution = Solution()
    result = solution.maxPathSum(root)
    
    print(result)
  • Java
import java.util.*;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

class Solution {
    private int maxSum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxGain

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

学长刷题笔记 文章被收录于专栏

这里收集了超全的刷题笔记,欢迎大家的订阅,会持续跟新的

全部评论
m
点赞 回复 分享
发布于 08-13 08:33 浙江

相关推荐

点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
3 11 评论
分享
牛客网
牛客企业服务