LintCode 439 [Segment Tree Build II]
1650 ワード
原題
セグメントツリーは、ノードが表す区間を表す2つの追加のプロパティstartとendを含む2つのツリーです.startおよびendは整数であり、ルートノードのstartおよびendはbuildメソッドによって与えられる.ノードAの左の息子にはstart=A.left,end=(A.left+A.right)/2がある.ノードAの右の息子にはstart=(A.left+A.right)/2+1,end=A.rightがある.startがendに等しい場合、このノードは葉ノードであり、左右の息子はいない.パラメータとしてstartとendを受け入れるbuildメソッドを実装し、各ノードがこの区間の最大値を含み、このセグメントツリーのルートを返す区間[start,end]を表すセグメントツリーを構築します.
[3,2,1,4]を与える.対応する線分ツリーは次のとおりです.
[0, 3] (max = 4)
/ \
[0, 1] (max = 3) [2, 3] (max = 4)
/ \ / \
[0, 0](max = 3) [1, 1](max = 2)[2, 2](max = 1) [3, 3] (max = 4)
問題を解く構想.
完全なコード
"""
Definition of SegmentTreeNode:
class SegmentTreeNode:
def __init__(self, start, end, max):
self.start, self.end, self.max = start, end, max
self.left, self.right = None, None
"""
class Solution:
# @oaram A: a list of integer
# @return: The root of Segment Tree
def build(self, A):
if not A:
return None
return self.helper(A, 0, len(A) - 1)
def helper(self, L, start, end):
if start == end:
root = SegmentTreeNode(start, end, L[start])
return root
root = SegmentTreeNode(start, end, 0)
if start != end:
mid = (start + end) / 2
root.left = self.helper(L, start, mid)
root.right = self.helper(L, mid + 1, end)
root.max = max(root.left.max, root.right.max)
return root