輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
複習知識點:二叉樹的遍歷
前中後序指的是根節點的順序,左總在右的前面
前序遍歷的順序是:根節點,左子節點(左子樹),右子節點(右子樹)。
中序遍歷的順序是:左子節點,根節點,右子節點。
後序遍歷的順序是:左子節點,右子節點,根節點。
這三種遍歷都有遞迴和迴圈兩種不同的實現方式,每種遍歷的遞迴實現都比迴圈實現簡潔很多。
由遍歷順序重構二叉樹:其實就是把前序遍歷中得到的根節點在中序遍歷中找到就可以分出左右子樹,不斷重複這個過程
python題解:
# -*- coding:utf-8 -*-
class treenode:
def __init__(self, x):
self.val = x
self.left = none
self.right = none
class solution:
# 返回構造的treenode根節點
def reconstructbinarytree(self, pre, tin):
# write code here
return self.findsubtree(pre,tin)
def findsubtree(self,front,mid):
if len(front)==0:
#print('null')
return none
if len(front)==1:
#print('return value '+str(front[0]))
return treenode(front[0])
else:
r = treenode(front[0])
index = mid.index(front[0])
#print('root:',front[0])
#print('尋找 '+str(front[0])+' 的左子樹')
r.left=self.findsubtree(front[1:index+1],mid[0:index])
#print('尋找 '+str(front[0])+' 的右子樹')
r.right=self.findsubtree(front[index+1:],mid[index+1:])
#print('子樹 '+str(front[0])+' 結束')
return r
以前序遍歷[1,2,4,7,3,5,6,8]和中序遍歷[4,7,2,1,5,3,8,6]為例,上述**中的print取消注釋,得到的重構二叉樹過程如下:
('root:', 1)
尋找 1 的左子樹
('root:', 2)
尋找 2 的左子樹
('root:', 4)
尋找 4 的左子樹
null
尋找 4 的右子樹
return value 7
子樹 4 結束
尋找 2 的右子樹
null
子樹 2 結束
尋找 1 的右子樹
('root:', 3)
尋找 3 的左子樹
return value 5
尋找 3 的右子樹
('root:', 6)
尋找 6 的左子樹
return value 8
尋找 6 的右子樹
null
子樹 6 結束
子樹 3 結束
子樹 1 結束
7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class treenode def init self,x self.val x self.right none self.lef...
7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序遍歷的確定根節點,可以根據此點分別找到左子樹跟右子樹的前序遍歷序列和中序遍歷序列,通過遞迴再分別構建子樹的左子樹和右子樹。如下 ...
劍指 7 重建二叉樹
題目描述 演算法分析 提交 class solution treenode reconstructbinarytreecore vector iterator start pre,vector iterator end pre,vector iterator start vin,vector ite...