**中序和前序
**題目(106-中等)
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
3
/ \9 20
/ \
15 7
思考
利用map來存放每個值和其相對應的下標值。
後序的特點是對於最後乙個元素就是根節點。
在中序中找到對應的根節點,進行左右的分割,遞迴進行左右子樹的建立。
位置關係的建立
取出來對應的最後乙個節點,命名為ri
,在中序中找到對應節點。
遞迴建立時候:
左子樹中的中序陣列:is
(表示中序的開始) =is
,ie
(表示中序的結束) =ri-1
。
左子樹中的後序陣列:ps
(表示後序的開始) =ps
,pe
(表示中序的結束) =ps+ri-is-1
(後序的結束= 後序的開始+ 中序中左子樹的長度**(ri-1-is)**)
右子數的中序陣列 :is = ri+1
,ie = ie
。
右子數的後序陣列 :ps = ps+ri-is-1+1
,pe = 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 然後要求按照其規則建立二叉樹,題目不難但是卻花費了我不少的時間 第一步,我想到的是需要什麼...