注意:
如果一棵二叉树除叶节点之外,其他的节点都有左孩子和右孩子,这样的树才能被先序和后序数组重建
#python3.5
#先序,中序数组重构二叉树
def preInToTree(pre, mid):
def preIn(pre, pi, pj, mid, mi, mj, map):
if pi > pj:
return None
head = TreeNode(pre[pi])
index = map.get(pre[pi])
head.left = preIn(pre, pi+1, pi+index-mi, mid, mi, index-1, map)
head.right = preIn(pre, pi+index-mi+1, pj, mid, index+1, mj, map)
return head
if pre == None or mid == None or len(pre) != len(mid):
return None
map = {}
for i in range(len(mid)):
map[mid[i]] = i
return preIn(pre, 0, len(pre)-1, mid, 0, len(mid)-1, map)
#中序,后序数组重构二叉树
def inPosToTree(mid, pos):
def inPos(mid, mi, mj, pos, si, sj, map):
if si > sj:
return None
head = TreeNode(pos[sj])
index = map.get(pos[sj])
head.left = inPos(mid, mi, index-1, pos, si, si+index-mi-1, map)
head.right = inPos(mid, index+1, mj, pos, si+index-mi, sj-1, map)
return head
if mid == None or pos == None or len(mid) != len(pos):
return None
map = {}
for i in range(len(mid)):
map[mid[i]] = i
return inPos(mid, 0, len(mid)-1, pos, 0, len(pos)-1, map)
#先序,后序数组重构二叉树
#一棵二叉树除叶子节点外,其他所有的节点都有左孩子和右孩子,才能被先序和后序数组重构出来
def prePosToTree(pre, pos):
def prePos(pre, pi, pj, pos, si, sj, map):
head = TreeNode(pre[pi])
if pi == pj:
return head
pi += 1
index = map.get(pre[pi])
head.left = prePos(pre, pi, pi+index-si, pos, si, index, map)
head.right = prePos(pre, pi+index-si+1, pj, pos, index+1, sj-1, map)
return head
if pre == None or pos == None or len(pre) != len(pos):
return None
map = {}
for i in range(len(pos)):
map[pos[i]] = i
return prePos(pre, 0, len(pre)-1, pos, 0, len(pos)-1, map)