題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
思路:根據中序遍歷和前序遍歷可以確定二叉樹,具體過程為:
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個就是陣列中...