輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回頭結點。二叉樹節點的定義如下:
class
treenode
:def
__init__
(self, x)
: self.val = x
self.left =
none
self.right =
none
以下圖的二叉樹為例
該二叉樹的先序遍歷序列為,中序遍歷序列為。
先序遍歷的順序是根節點→左子節點→右子節點
中序遍歷的順序是左子節點→根節點→右子節點
因此,在先序遍歷序列中,第乙個元素即為二叉樹的根。對應到中序遍歷序列中,根元素所在位置以左的為其左子樹的中序遍歷序列,根元素所在位置以右的為其右子樹的中序遍歷序列。如下圖所示
我們可以通過以下步驟,遞迴地構造二叉樹:
先序遍歷序列第乙個元素為根
找到根元素在中序遍歷序列中的位置
計算出先序和中序遍歷序列中左子樹和右子樹遍歷序列的範圍
遞迴的計算左右子樹
def
reconstructbinarytree
(self, pre, tin):if
len(pre)==0
:# 若二叉樹為空則返回none
return
none
iflen
(pre)==1
:# 若二叉樹只有乙個節點,則返回該節點
return treenode(pre[0]
) root = treenode(pre[0]
)# 根為先序遍歷序列的第乙個元素
mid = tin.index(pre[0]
)# 用mid定位中序遍歷序列中根元素的位置
root.left = self.reconstructbinarytree(pre[
1:mid+1]
, tin[
:mid]
)# 遞迴的構建左子樹
root.right = self.reconstructbinarytree(pre[mid+1:
], tin[mid+1:
])# 遞迴的構建右子樹
return root
已知先序遍歷中序遍歷和已知中序遍歷後序遍歷,構造二叉樹的方法類似
有關二叉樹的很多問題都可通過遞迴來解決
def
reconstruct_post_in
(self, post, tin):if
len(post)==0
:# 若二叉樹為空則返回none
return
none
iflen
(post)==1
:# 若二叉樹只有乙個節點,則返回該節點
return treenode(post[0]
) root = treenode(post[-1
])# 根為後序遍歷序列的最後乙個元素
mid = tin.index(post[-1
])# 用mid定位中序遍歷序列中根元素的位置
root.left = self.reconstruct_post_in(post[
:mid]
, tin[
:mid]
)# 遞迴的構建左子樹
root.right = self.reconstruct_post_in(post[mid:-1
], tin[mid+1:
])# 遞迴的構建右子樹
return root
4 重建二叉樹(劍指offer)
4.重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。1 思路 通常樹有如下幾種遍歷方式 前序遍歷 先訪問根結點,再訪問左子結點,最後訪問右子結點。root一般在最前 中...
劍指offer4 重建二叉樹
給出前序遍歷和中序遍歷,重新構建二叉樹.重建二叉樹主要就是遞迴,每一次新增乙個結點進入二叉樹,保證遞迴的順序和前序遍歷順序一致就ok了,多以左子樹的遞迴在前面,右子樹的遞迴放在後面,和前序遍歷的順序一致,第一次遞迴新增前序遍歷陣列中的第乙個,第二次遞迴新增的是前序遍歷陣列中的第二個.第n個就是陣列中...
劍指offer 4 重建二叉樹
題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。思路 中序序列中,節點左邊為左子樹,右邊為右子樹。前序第乙個為根節點 12 4 7 3 5 6 8 左 4 7 215 3...