LeetCode 1130
这个题目看起来挺复杂的,读懂这个题目还花了点时间。
给出的这个数组,是中序遍历后挑出所有叶子节点组成的一个数组。
1. 根据题目的要求,每个非叶子节点都有2个子节点。说明这棵树是满二叉树(Full Binary Tree),那么就有特性,如过有n个叶子节点,这棵树总是有n-1个非叶子节点。所以非叶子节点的个数是固定的。那么这个题目可以转换为想办法去找最小非叶子节点值的和问题。
2. 所有的非父节点都是左右子树中最大叶子节点的product。而给出的叶子节点是中序遍历的结果。我们只能使用相邻两个节点去找最小product,而这个结果可以当作一个非叶子节点来用。同时在两个节点中大的这个,作为下一轮的输入。可以重复这个方法一直找到所有的n-1个非叶子节点。
转为代码:
def mctFromLeafValues(self, arr: List[int]) -> int:
nl = len(arr)
if nl <= 1: return 0
miniIndex = 0
product = sys.maxsize
for i in range(nl-1):
newp = arr[i] * arr[i+1]
if newp < product:
product = newp
if arr[i] < arr[i+1]:
miniIndex = i
else:
miniIndex = i+1
arr.pop(miniIndex)
return product + self.mctFromLeafValues(arr)