輸入一棵二叉樹前序遍歷和中序遍歷的結果,請重建該二叉樹。
注意:
二叉樹中每個節點的值都互不相同;
輸入的前序遍歷和中序遍歷一定合法;
樣例
給定:
前序遍歷是:[3, 9, 20, 15, 7]
中序遍歷是:[9, 3, 15, 20, 7]
返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉樹如下所示:
3/ \
9 20
/ \
15 7
思路:
1、遞迴構造樹,所以第一步要寫明確遞迴終止的條件,即陣列中結點為空的時候,返回空。
2、構造 新的結點,即前序遍歷的第乙個結點,並且找到其在中序遍歷中的位置
3、構造其左右子樹,把前序遍歷列表分為左右子樹前序列表,把中序遍歷分為了左右子樹中序列表
4、返回構造好的結點,遞迴依次對其進行迴圈構造。
acwing-18 c++ code:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
treenode* head =
newtreenode
(preorder[0]
);int head_id =0;
for(
int i =
0; i < inorder.
size()
; i++)}
vector<
int> pre_left, pre_right, in_left, in_right;
for(
int i =
0; i < head_id; i++
)for
(int i = head_id +
1; i < preorder.
size()
; i++
)
head-
>left =
buildtree
(pre_left, in_left)
; head-
>right =
buildtree
(pre_right, in_right)
;return head;}}
;
牛客網 c++ code:
/**
* definition for binary tree
* struct treenode
* };
*/class
solution
treenode *head =
newtreenode
(pre[0]
);vector<
int> pre_left;
vector<
int> pre_right;
vector<
int> vin_left;
vector<
int> vin_right;
int head_id =0;
for(
; vin[head_id]
!= head-
>val; head_id++
)for
(head_id = head_id +
1; head_id < pre.
size()
; head_id++
) head-
>left =
reconstructbinarytree
(pre_left, vin_left)
; head-
>right =
reconstructbinarytree
(pre_right, vin_right)
;return head;}}
;
acwing-18 python code:
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
(object):
defbuildtree
(self, preorder, inorder)
:"""
:type preorder: list[int]
:type inorder: list[int]
:rtype: treenode
"""ifnot preorder or
not inorder:
return
none
head = treenode(preorder[0]
)
head_id =
0for i in
range
(len
(inorder)):
if inorder[i]
== preorder[0]
: head_id = i
break
pre_left =
pre_right =
in_left =
in_right =
for i in
range
(head_id):1
]))for i in
range
(head_id +1,
len(inorder)):
))head.left = self.buildtree(pre_left, in_left)
head.right = self.buildtree(pre_right, in_right)
return head
劍指offer7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並輸出它的頭節點。根據先序序列第乙個數確定樹的根節點,在中序序列中找到這個數所在的位置,此處左邊為左子樹,右邊為右子樹,根據遞迴建立二叉樹。...
劍指offer 7 重建二叉樹
因為各種各樣的原因,要開始準備春招,所以開始刷劍指offer 第二版 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。這個是個二叉樹很基礎的題啦,需要用遞迴來實現。主要講解在書的6...
《劍指offer》 7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重新構造出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中不包含重複的數字。例如輸入的前序遍歷序列為 1,2,4,7,3,5,6,8 和中序遍歷為,則重建出二叉樹並輸出它的頭結點。思路 public class binarytreenode public bi...