每个节点不可以重复经过求,求二叉树的最大路径和。
二叉树如图
本文采用深度优先算法解题。假设每个节点都有两个属性,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))