劍指offer筆記4 重建二叉樹(Python)

2021-10-03 06:08:38 字數 2042 閱讀 6447

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回頭結點。二叉樹節點的定義如下:

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...