輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
網上大多只給出一種思路,就是遞迴
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個就是陣列中...