二叉树最大路径和

每个节点不可以重复经过求,求二叉树的最大路径和。

在这里插入图片描述
二叉树如图

本文采用深度优先算法解题。假设每个节点都有两个属性,s(stop),c(continue)
s属性为,该节点及其以下节点的不停止走法最大值。c属性为在还有路可走的情况下的最大值。

举例说明:

1叶子节点

node4节点,有两条路可走:路线一和路线二

在这里插入图片描述

路线一意味着,经过node4后无处可走,路线二意味着经过node4后还有路可走。分别对应着s属性与c属性。
s = 10 , c = 10
因此得出结论1:在叶子节点,s属性与c属性时一致的,等于本节点的值。

2 双亲结点

我们来分析node2的两个属性。
在这里插入图片描述
node2的s值有三种情况:10,12,24,10,12
node2 的 c值有 12, 14, 2
为什么有三个值呢?

先看s属性,s属性分为五种情况,

node4的c    10(node4本可以继续,但是没有继续)
node5的c    12(同理)
node4->node2->node5     24
node4的s  10
node5的s   12 

c属性,分为三种,

node4->node2->  12
node5->node2->  14
node2->          2

对node2的s属性和c属性取最大值得。s = 24 c = 14

因此可以得出下图
在这里插入图片描述

3

对node1进行分析
c属性为:

node2的c->node1  2 
node3的c->node1   15
node1(特性虽然无路可走也要加上这种情况)

s属性分为五种几种情况:

node1->node2的c  15
node1-> node3的c 2
node2的s 24
node3 的s 2
ode2的c->node1-> node3 的c 16

此时比较node1的c与s,最大值为24,因此结果为24.

代码实现:


class tree_node():
    def __init__(self,x,):
        self.left = None
        self.right = None
        self.value = x

    def helper(self,root):
        if root.left == None:
            lefts, leftc = 0, 0
        else:
            leftc,lefts = self.helper(root.left)
        if root.right == None:
            rights, rightc = 0, 0
        else:
            rightc,rights = self.helper(root.right)
        c = max(root.value+leftc,root.value+rightc,root.value)
        s = max(lefts,rights,leftc,rightc,root.value+leftc+rightc)
        return c,s

if __name__ == '__main__':
    node7 = tree_node(1)
    node6 = tree_node(2)
    node5 = tree_node(12)
    node4 = tree_node(10)
    node3 = tree_node(-1)
    node2 = tree_node(2)
    node1 = tree_node(1)
    node1.left = node2
    node1.right = node3
    node2.left = node4
    node2.right = node5
    node3.left = node6
    node3.right = node7
    print(node1.helper(node1))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值