题目链接:https://leetcode.com/problems/longest-univalue-path/
这道题没有做出来,伤心。其实就差那么一点了,最终还是没有……,特此纪念这道题。
该思路本质上后序的过程,在遍历完左右子树后,在遍历“根节点“的时候,判断“根节点“的值和右子树上的“根节点“是否相同。相同的话,则将left=left+1;否则赋值为0。同样的方法判断左子树上的“根节点“。经过上面的判断后,left+right!=0,那么left+right的路径长度为跨越“根节点“的路径长度或者是根节点和左子树的路径长度(根节点和左子树的根节点的值是相同的),又或者是“根节点“和右子树的路径长度(同理)。如果,left+right==0,那么“根节点“和左右子树的“根节点“的树都是不同的。曾经出现过的最长路径已经存储在self.longest中了。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def longestUnivaluePath(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root==None:
return 0
self.longest=0#存储全局最优
self.postOrder(root)
return self.longest
def postOrder(self,root):
if root:
left=self.postOrder(root.left)
right=self.postOrder(root.right)
left=(left+1) if root.left and root.val==root.left.val else 0#该节点的值和左节点的值是相同的,那么left+1;不相等或者是左节点不存在的话,left赋值为0
right=(right+1) if root.right and root.val==root.right.val else 0
self.longest=max(self.longest,left+right)#和全局最优进行比较,返回较大的值
return max(left,right)#只返回left和right,而不返回left+right(跨越根节点的路径,跨越根节点的路径如果是最长的,那么已经存储到self.longest中去了)
return 0