二叉树的最大路径和

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42


嗯,拿到这个题,确实有点懵, 看了别人的讲解才懂 , 尽量按照自己的话把思路说出来.

所有的情况都可以归结为 只有3个节点, 不论左子树/右子树有多复杂,都可以把左子树看成一个处理后的叶子节点,根节点不关心左子树的值 , 根节点只关心左边可以提供的最大值 , 如果是叶子节点,就是有2个NULL节点, 现在把一个复杂的树 变成了3个节点 , 考虑这3个节点的情况.

任意节点的最长路径 = 此节点的值 + max(左孩子能提供的值,0) + max(右孩子能提供的值,0);
任意节点可以向上提供的最大值 = 此节点的值 + max(左孩子能提供的值 , 右孩子能提供的值 , 0);

经过遍历之后,比较出最大的  任意节点的最长路径 就是结果了 .

#import <Foundation/Foundation.h>
#import "Node.h"

Node * initTree() {
    Node * root10 = [Node nodeWithData:10];
    Node * left5 = [Node nodeWithData:5];
    Node * right15 = [Node nodeWithData:15];
    root10.left = left5;
    root10.right = right15;
    
    Node * left1 = [Node nodeWithData:1];
    Node * right7 = [Node nodeWithData:7];
    left5.left = left1;
    left5.right = right7;
    
    Node * left12 = [Node nodeWithData:12];
    Node * right18 = [Node nodeWithData:18];
    right15.left = left12;
    right15.right = right18;
    
    Node * left6 = [Node nodeWithData:6];
    right7.left = left6;
    
    Node * left17 = [Node nodeWithData:17];
    right18.left = left17;

    Node * right2 = [Node nodeWithData:2];
    left1.right = right2;
    
    return root10;
}
NSInteger sum = INTMAX_MIN;
// 这个函数最开始的目的是计算出能给父节点提供的数据,但是发现在计算的过程中可以顺道算出 此节点的最大长度 , 也就能获取到最长节点了
NSInteger valueToSuper(Node * root){
    if (root == nil) {
        return 0;
    }

    // 获取左节点能给自己提供的数据
    NSInteger leftValue = MAX(valueToSuper(root.left),0);
    // 获取右节点能给自己提供的数据
    NSInteger rightValue = MAX(valueToSuper(root.right),0);
    
    // 根据提供给父节点的数据,计算出此节点对应的最大长度
    NSInteger currentMax = root.data + leftValue + rightValue ;
    sum = MAX(sum, currentMax);

    return root.data + MAX(leftValue, rightValue);

}

int main(){    
    
    // 初始化树
    Node * root = initTree();
    valueToSuper(root);
    NSLog(@"二叉树最大路径和--%@",@(sum));
}
 

节点类,

#import <Foundation/Foundation.h>
 
@interface Node : NSObject
 
@property (nonatomic,assign) NSInteger data ;
@property (nonatomic,strong) Node * left ;
@property (nonatomic,strong) Node * right ;
 
+ (instancetype)nodeWithData:(NSInteger)data;
 
@end
 
 
#import "Node.h"
 
@implementation Node
 
+ (instancetype)nodeWithData:(NSInteger)data {
    
    Node * n = [[self alloc] init];
    n.data = data;
    return n;
    
}
 
- (NSString *)description {
    return @(self.data).description;
}
 
@end

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值