解題思路:(1)遞迴構造二叉樹,構建根節點,根據中序遍歷找到左子樹的節點和右子樹的結點,構建左子樹,構建右子樹
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
buildtree
(self, preorder: list[
int]
, inorder: list[
int])-
> treenode:
iflen
(inorder)==0
:return
none
root = treenode(preorder[0]
) i = inorder.index(root.val)
left = self.buildtree(preorder[
1:i+1]
, inorder[
:i])
right = self.buildtree(preorder[i+1:
],inorder[i+1:
])root.left = left
root.right = right
return root
解題思路:(2)迭代,用棧來模擬遞迴,整個出棧入棧的過程就是中序遍歷的過程,只是訪問的過程就是棧頂元素和當前中序遍歷中元素相等時候
class
solution
:def
buildtree
(self, preorder: list[
int]
, inorder: list[
int])-
> treenode:
iflen
(preorder)==0
:return
none
prei, inoi =1,
0 root = treenode(preorder[0]
) s =
[root]
while
(len
(s))
:while
(prei <
len(preorder)
and s[-1
].val != inorder[inoi]):
s[-1
].left = treenode(preorder[prei])-
1].left)
prei +=
1while
(len
(s)and s[-1
].val == inorder[inoi]):
cur = s.pop(
) inoi +=1if
(prei <
len(preorder)):
cur.right = treenode(preorder[prei]
) prei +=
1return root
LeetCode 面試題07 重建二叉樹
先序遍歷第乙個元素就是根結點,中序遍歷根節點前面是它的左子樹,後邊是它的右子樹。根據這個思想可以遞迴的處理,每次得到乙個當前階段的根結點 先序遍歷第乙個元素 然後根據這個元素將中序遍歷劃分成兩個序列,分別是左子樹和右子樹的中序遍歷,根據這兩個序列的長度又可以從先序遍歷中得到它們對應的先序遍歷。這樣就...
LeetCode 面試題07 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7二叉樹結構 public class...
面試題07 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7限制 0 節點個數 5000 題解 ...