劍指Offer面試題七重建二叉樹

2021-10-06 20:51:38 字數 2794 閱讀 1177

劍指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...