105 從前序與中序遍歷序列構造二叉樹 中等

2021-10-17 11:18:20 字數 1936 閱讀 7312

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder = [3,9,20,15,7]

中序遍歷 inorder = [9,3,15,20,7]

返回如下的二叉樹:

3/ \

9 20

/ \

15 7

對於任意一顆樹而言,前序遍歷的形式總是

[ 根節點, [左子樹的前序遍歷結果], [右子樹的前序遍歷結果] ]

即根節點總是前序遍歷中的第乙個節點。而中序遍歷的形式總是

[ [左子樹的中序遍歷結果], 根節點, [右子樹的中序遍歷結果] ]

這樣以來,我們就知道了左子樹的前序遍歷和中序遍歷結果,以及右子樹的前序遍歷和中序遍歷結果,我們就可以遞迴地對構造出左子樹和右子樹,再將這兩顆子樹接到根節點的左右位置。

如上圖:

preleft、preleft+1、preright、inleft、inright都可以又提供的陣列求出

pindex根據preleft,在map中取出

由於 前序遍歷的左子樹的節點數 = 中序遍歷的左子樹的節點數

所以pindex - 1 - inleft = x - (preleft + 1) ,求出x = pindex - inleft + preleft

public

class

leetcode_105

public treenode buildtree

(int

preorder,

int[

] inorder)

// 使用map儲存中序遍歷的節點,方便快速定位根節點

mapmap =

newhashmap

<

>()

;for

(int i =

0; i < inlen; i++

)return

buildtree

(preorder,

0, prelen -

1, map,

0, inlen -1)

;}private treenode buildtree

(int

preorder,

int preleft,

int preright, map

map,

int inleft,

int inright)

// 前序遍歷中的第乙個節點就是根節點

int rootval = preorder[preleft]

; treenode root =

newtreenode

(rootval)

;// 在中序遍歷中定位根節點

int pindex = map.

get(rootval)

;// 遞迴地構造左子樹,並連線到根節點

root.left =

buildtree

(preorder,preleft +

1, pindex - inleft + preleft, map, inleft, pindex -1)

;// 遞迴地構造右子樹,並連線到根節點

root.right =

buildtree

(preorder, pindex - inleft + preleft +

1, preright, map, pindex +

1, inright)

;return root;

}}

Leetcode 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree node...

105 從前序與中序遍歷序列構造二叉樹

如題,根據前序與中序遍歷序列構造二叉樹 整體思路 前序遍歷的第乙個元素,必然是二叉樹的根節點 在中序遍歷中找到前序遍歷第乙個元素的位置 該位置左邊的所有點都是二叉樹的左子樹元素,該位置右邊的所有點都是二叉樹的右子樹元素 思路一 遞迴 字典 由整體思路可以構建子函式用於遞迴,不斷求子樹的左右子樹,直到...

105 從前序與中序遍歷序列構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 def buildtree2 preorder,inorder i...