给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 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