二叉樹的建立

2021-10-09 19:28:54 字數 2213 閱讀 3457

**中序和前序

**題目(106-中等)

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

注意:

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

例如,給出

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

後序遍歷 postorder = [9,15,7,20,3]

返回如下的二叉樹:

3

/ \9 20

/ \

15 7

思考

利用map來存放每個值和其相對應的下標值。

後序的特點是對於最後乙個元素就是根節點。

在中序中找到對應的根節點,進行左右的分割,遞迴進行左右子樹的建立。

位置關係的建立

取出來對應的最後乙個節點,命名為ri,在中序中找到對應節點。

遞迴建立時候:

左子樹中的中序陣列:is(表示中序的開始) =isie(表示中序的結束) =ri-1

左子樹中的後序陣列:ps(表示後序的開始) =pspe(表示中序的結束) =ps+ri-is-1(後序的結束= 後序的開始+ 中序中左子樹的長度**(ri-1-is)**)

右子數的中序陣列 :is = ri+1ie = ie

右子數的後序陣列 :ps = ps+ri-is-1+1pe = pe-1

見下圖:

hashmap

memo =

newhashmap

<

>()

;int

post;

public treenode buildtree

(int

inorder,

int[

] postorder)

public treenode buildtree

(int is,

int ie,

int ps,

int pe)

題目(105-中等)

思考利用map存放具體的值於其對應的下標值。

對應的前序遍歷來說第乙個值就是我們的頭節點值。

在中序中尋找對應的值,然後進行左右子樹的分割處理。

位置關係的建立

具體的思想見上面的分析,這裡不再進行深入的分析:

private

int[

] preorder;

private map

hash;

public treenode buildtree

(int

preorder,

int[

] inorder)

return

buildtree(0

, prelen -1,

0, inlen -1)

;}private treenode buildtree

(int preleft,

int preright,

int inleft,

int inright)

int pivot = preorder[preleft]

; treenode root =

newtreenode

(pivot)

;int pivotindex = hash.

get(pivot)

; root.left =

buildtree

(preleft +

1, pivotindex - inleft + preleft,

inleft, pivotindex -1)

; root.right =

buildtree

(pivotindex - inleft + preleft +

1, preright,

pivotindex +

1, inright)

;return root;

}

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

二叉樹的建立 遍歷1 建立二叉樹

談二叉樹,如果二叉樹都沒有正確的建立出來,那豈不是紙上談兵!括號表示式 表示方法 1.括號 括號內的東西是括號前的元素的孩子 2.逗號 逗號是為了區分左右孩子 演算法分析 給出乙個如上的括號表示式 a b d g e,f 再利用棧這個資料結構,分析一下 掃瞄整個括號表示的字串,這個字串中只有四種字元...

建立二叉樹

今天看到了乙個資料結構的筆試題目,他要求寫出建立二叉樹的程式。我想練習練習,所以想了一下其大致的思路,記錄如下 題目的要求很簡單,給出乙個字串序列 比如說a b d,e h j,k l,m n c f,g i 然後要求按照其規則建立二叉樹,題目不難但是卻花費了我不少的時間 第一步,我想到的是需要什麼...