經典問題剖析 由前序 中序遍歷序列構造二叉樹

2021-10-10 17:58:57 字數 2438 閱讀 1938

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

注意:

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

示例:給出

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

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

返回如下的二叉樹:

3/ \

9 20

/ \

15 7

清楚前序遍歷和中序遍歷的過程:

由解題思路,很容易寫出此題的遞迴解法**。

示例**:

class

btreenode

(val value: int)

funbuildbtreebypreorderandinorder

(preorder: intarray, inorder: intarray)

: btreenode?

return

buildbtreenode

(preorder, inorderindexhashmap,

0, preorder.size -1,

0, inorder.size -1)

}fun

buildbtreenode

(preorder: intarray, indexmap: mutablemap

, preorderleft: int, preorderright: int, inorderleft: int, inorderright: int)

: btreenode?

//根節點

val root =

btreenode

(preorder[preorderleft]

)//通過跟節點的value值找在inorder中的index

val index = indexmap[preorder[preorderleft]]?:

return

null

//找左子樹的在preorder和inorder中的左右index

//左子樹 在preorder中的左右index

val leftchildtreeonpreorderindexleft = preorderleft +

1val leftchildtreeonpreorderindexright = index - inorderleft + preorderleft

//左子樹 在inorder中的左右index

val leftchildtreeoninorderindexleft = inorderleft

val leftchildtreeoninorderindexright = index -

1//右子樹 在preorder中的左右index

val rightchildtreeonpreorderindexleft = leftchildtreeonpreorderindexright +

1val rightchildtreeonpreorderindexright = preorderright

//右子樹 在inorder中的左右index

val rightchildtreeoninorderindexleft = index +

1val rightchildtreeoninorderindexright = inorderright

root.left =

buildbtreenode

(preorder, indexmap, leftchildtreeonpreorderindexleft, leftchildtreeonpreorderindexright, leftchildtreeoninorderindexleft, leftchildtreeoninorderindexright)

root.right =

buildbtreenode

(preorder, indexmap, rightchildtreeonpreorderindexleft, rightchildtreeonpreorderindexright, rightchildtreeoninorderindexleft, rightchildtreeoninorderindexright)

return root

}

時間複雜度:陣列中每個值都要訪問構建二叉樹節點,所以時間複雜度為o(n)

空間複雜度:使用hash表儲存根節點的index,需要o(n)的空間,最多有o(logn)個函式呼叫,所以空間複雜度是o(n)

leetcode傳送門:105. 從前序與中序遍歷序列構造二叉樹

由前序序列與中序序列實現後序遍歷

二叉樹是一種特殊的樹,二叉樹只有兩個分支,分別是該節點的左兒子和右兒子。前序遍歷 就是先遍歷根節點,然後再訪問左子樹與右子樹。遍歷子樹的時候同樣也是先遍歷根節點然後在遍歷他的左子樹與右子樹。中序遍歷 先遍歷左子樹,在遍歷根節點,最後遍歷右子樹。後序遍歷 先遍歷左子樹與右子樹,在遍歷根節點。因為有這樣...

由前序遍歷和中序遍歷,求後序遍歷

若已知一棵二叉樹的前序序列是 b e f c g d h,中序序列是 f e b g c h d 則它的後序序列 前序遍歷 先遍歷根節點,再遍歷左孩子,最後遍歷右孩子。中序遍歷 先遍歷左孩子,再遍歷根節點,最後遍歷右孩子。所以,遍歷的序列也是這個規律。首先,看前序遍歷中b節點,它是第乙個節點,也是根...

由二叉樹的前序遍歷序列和中序遍歷序列求後序遍歷序列

給出二叉樹的前序遍歷序列和中序遍歷序列,求後序遍歷序列。比如節點內儲存的資料型別為char的二叉樹,給出前序遍歷序列 abdec 中序遍歷序列 dbeac 則輸出後序遍歷序列。可以寫乙個遞迴函式實現,首先由前序遍歷序列的第乙個元素確定根節點,然後再中序遍歷序列中找出等於該元素的位置索引,則根據中序遍...