劍指offer系列 4 重建二叉樹

2021-10-10 07:23:09 字數 1724 閱讀 5178

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

網上大多只給出一種思路,就是遞迴

public treenode reconstructbinarytree

(int

pre,

int[

] in)

return

f(pre, in,

0, pre.length-1,

0, in.length-1)

;}public

static treenode f

(int

pre,

int[

] in,

int p_s,

int p_e,

int i_s,

int i_e)

treenode node =

newtreenode

(pre[p_s]);

/** * 尋找左子樹的陣列範圍

* --左子樹pre陣列範圍

* --左子樹in陣列範圍

*/int lp_s,lp_e;

int li_s,li_e;

int l_num=0;

// 左子樹有幾個元素

for(

int i=i_s;i<=i_e;i++)}

lp_s=p_s+1;

lp_e=lp_s+l_num-1;

li_s=i_s;

li_e=li_s+l_num-1;

node.left=

f(pre, in, lp_s, lp_e, li_s, li_e)

;/**

* 尋找右子樹的陣列範圍

* --右子樹pre陣列範圍

* --右子樹in陣列範圍

*/int rp_s,rp_e;

int ri_s,ri_e;

rp_s=lp_e+1;

rp_e=p_e;

ri_s=li_e+2;

ri_e=i_e;

node.right=

f(pre, in, rp_s, rp_e, ri_s, ri_e)

;return node;

}利用arrays.

copyofrange

(oriarray,s,e)

,可以簡化**,使邏輯更清晰

// 利用arrays.copyofrange(s,e),左閉右開

public treenode reconstructbinarytree1

(int

pre,

int[

] in)

return

f1(pre, in);}

public

static treenode f1

(int

pre,

int[

] in)

if(pre.length<

1||in.length<1)

treenode node =

newtreenode

(pre[0]

);int l_num=0;

// 左子樹有幾個元素

for(

int i=

0;iif(l_num!=0)

if(l_numreturn node;

}

4 重建二叉樹(劍指offer)

4.重建二叉樹 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。1 思路 通常樹有如下幾種遍歷方式 前序遍歷 先訪問根結點,再訪問左子結點,最後訪問右子結點。root一般在最前 中...

劍指offer 解題系列(4) 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 前序遍歷的特點是,開頭的是父節點 那麼就可以利用前序遍歷的第乙個節點,把中序遍歷分割為左,右兩段,再通過左,右的長度,反過來把...

劍指offer4 重建二叉樹

給出前序遍歷和中序遍歷,重新構建二叉樹.重建二叉樹主要就是遞迴,每一次新增乙個結點進入二叉樹,保證遞迴的順序和前序遍歷順序一致就ok了,多以左子樹的遞迴在前面,右子樹的遞迴放在後面,和前序遍歷的順序一致,第一次遞迴新增前序遍歷陣列中的第乙個,第二次遞迴新增的是前序遍歷陣列中的第二個.第n個就是陣列中...