劍指offer面試題——七
題目描述:輸入某個二叉樹的前序遍歷和中序遍歷結果,重建該二叉樹.。例如輸入前序遍歷[1,2,4,7,3,5,6,8] 和中序遍歷[4,7,2,1,5,3,8,6]則重建如下圖的二叉樹
1
/ \
23// \
456\ /
78
首先我們來看一下二叉樹的遍歷,所有前序遍歷的第乙個元素,一定是該二叉樹的根節點。但是在中序遍歷中根節點是在中間的,所以根據這兩個特點,可以在中序遍歷的陣列中掃瞄,直到找到前序遍歷中的根節點,這樣就可以將中序遍歷的陣列分為三個部分。
如上圖所示,前序遍歷中第乙個數1就是根節點,然後再中序遍歷中掃瞄直到找到1為止,根據中序遍歷(左根右)的特點,1前面的三個數[2,4,7] 就是左子樹的節點的值,1後面的四個數[5,3,8,6]就是右子樹節點的值這時就找到了第乙個根節點1
1
/ \
[2,4,7]
[5,3
,8,6
]
然後這時就以前序遍歷片段[2,4,7] 和 中序遍歷片段[4,7,2] 重複完成上述過程
1
/ \
2[5,3,8
,6]/
[4,7
]
package datasturct;
public
class
constructcore
;int
infix =
; treenode construct =
construct
(pre, infix)
; system.out.
println
(construct);}
private
static treenode construct
(int
pre,
int[
] infix)
return
constructtree
(pre, infix,
0, pre.length -1,
0, infix.length -1)
;}/** * @param pre 前序便利陣列
* @param infix 中序遍歷陣列
* @param prestart 遞迴時使用pre前序遍歷陣列開始的地方
* @param preend 遞迴時使用pre前序遍歷陣列結束的地方
* @param infixstart 遞迴時使用infix中序遍歷陣列開始的地方
* @param infixend 遞迴時使用infix中序遍歷陣列開始的地方
* @return 返回重建二叉樹之後的根節點
*/public
static treenode constructtree
(int
pre,
int[
] infix,
int prestart,
int preend,
int infixstart,
int infixend)
}int rootinfix = infixstart;
//通過while迴圈找到rootval在中序遍歷陣列infix中的位置
while
(rootinfix <= infixend && infix[rootinfix]
!= rootval)
//如果到最後還沒有找到
if(rootinfix == infixend && infix[rootinfix]
!= rootval)
int leftlength = rootinfix - infixstart;
//左子樹長度 應該為 根節點索引 - 中序遍歷陣列開始的位置
int leftpreend = prestart + leftlength;
// 下一次向左遞迴 前序遍歷陣列結束的位置 應該為前序遍歷陣列開始的位置
if(leftlength >0)
if(leftlength < preend - prestart)
return root;}}
class
treenode
public
intgetvalue()
public
void
setvalue
(int value)
public treenode getleft()
public
void
setleft
(treenode left)
public treenode getright()
public
void
setright
(treenode right)
@override
public string tostring()
';}public
void
preorder()
if(this
.right != null)
}public
void
infixorder()
system.out.
println
(this);
if(this
.right != null)
}}
面試題七 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷結果,請重建二叉樹,假設不含重複數字 分析 前序遍歷中的根節點在序列的第乙個,根節點在中序遍歷結果序列中可以將左右子樹分開 binarytreenode construct int a int b binarytreenode constructcore int a ...
劍指offer 面試題6 重建二叉樹
題目 輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重複的數字。例如,前序遍歷序列 1,2,4,7,3,5,6,8 中序遍歷序列 4,7,2,1,5,3,8,6 則重建出的二叉樹如下所示,並輸出它的頭結點1。基本思想 前序遍歷 前序遍歷首先訪問根結點...
劍指offer《面試題6 重建二叉樹》
題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出下圖所示的二叉樹並輸出它的頭結點。1 2 3 4 5 6 7 8 劍指offer 名企面試官精講典型程式設計題 著作權所有者 何海濤 inc...