劍指offer 17 重建二叉樹

2021-10-05 09:12:09 字數 1910 閱讀 1377

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

思路:根據中序遍歷和前序遍歷可以確定二叉樹,具體過程為:

1、根據前序序列第乙個結點確定根結點;

2、根據根結點在中序序列中的位置分割出左右兩個子串行;

3、對左子樹和右子樹分別遞迴使用同樣的方法繼續分解

例如:前序序列 = pre

中序序列 = in

1、根據當前前序序列的第乙個結點確定根結點,為 1,找到 1 在中序遍歷序列中的位置,為 in[3];

2、切割左右子樹,則 in[3] 前面的為左子樹, in[3] 後面的為右子樹,則切割後的左子樹前序序列為:,切割後的左子樹中序序列為:;切割後的右子樹前序序列為:,切割後的右子樹中序序列為:;

3、對子樹分別使用同樣的方法分解

class

treenode

:def

__init__

(self, x)

: self.val = x

self.left =

none

self.right =

none

class

solution

:# 返回構造的treenode根節點

defreconstructbinarytree

(self, pre, tin)

:# write code here0

iflen

(pre)==0

:return

none

iflen

(pre)==1

:return treenode(pre[0]

) root=treenode(pre[0]

) tinl=tin[

:tin.index(pre[0]

)]tinr=tin[tin.index(pre[0]

)+1:

] root.left=self.reconstructbinarytree(pre[

1:tin.index(pre[0]

)+1]

,tinl)

root.right=self.reconstructbinarytree(pre[tin.index(pre[0]

)+1:

],tinr)

return root

換一種更簡潔的寫法

class

treenode

:def

__init__

(self, val)

: self.val = val

self.leftchild =

none

self.rightchild =

none

#知道前序和中序,重建二叉樹

defrebuildtree

(prorder, inorder):if

len(prorder)==0

:return

none

else

: root = treenode(prorder[0]

) k = inorder.index(prorder[0]

) root.leftchild = rebuildtree(prorder[

1:k +1]

, inorder[

:k])

root.rightchild = rebuildtree(prorder[k +1:

], inorder[k +1:

])return root

4 重建二叉樹(劍指offer)

4.重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。1 思路 通常樹有如下幾種遍歷方式 前序遍歷 先訪問根結點,再訪問左子結點,最後訪問右子結點。root一般在最前 中...

劍指offer 樹 7 重建二叉樹

使用雜湊表map記錄中序遍歷每個元素的位置 利用性質 1.先序遍歷的第乙個節點是根節點 2.中序遍歷的根節點的左邊是左子樹,右邊是右子樹 假設左子樹的中序遍歷的長度是len,在前序遍歷中,根節點後面len個數,是左子樹的前序遍歷,剩下的數是右子樹的前序遍歷 根據左右子樹的前序遍歷和中序遍歷,我們先遞...

劍指offer4 重建二叉樹

給出前序遍歷和中序遍歷,重新構建二叉樹.重建二叉樹主要就是遞迴,每一次新增乙個結點進入二叉樹,保證遞迴的順序和前序遍歷順序一致就ok了,多以左子樹的遞迴在前面,右子樹的遞迴放在後面,和前序遍歷的順序一致,第一次遞迴新增前序遍歷陣列中的第乙個,第二次遞迴新增的是前序遍歷陣列中的第二個.第n個就是陣列中...