劍指offer7 重建二叉樹

2021-09-22 10:20:04 字數 3249 閱讀 3632

輸入一棵二叉樹前序遍歷和中序遍歷的結果,請重建該二叉樹。

注意:

二叉樹中每個節點的值都互不相同;

輸入的前序遍歷和中序遍歷一定合法;

樣例

給定:

前序遍歷是:[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...