1.每次遞迴,找到前序子串行中的第一項作為當前根結點
2.尋找當前根結點在中序子串行的位置,當前中序序列其左側是當前根結點左子樹的中序子串行,右側是當前根結點右子樹的中序子串行
3.在前序子串行裡找到對應的當前根結點的左右子樹元素前序序列的左右子數的序列
4.對當前根結點的左子樹和右子樹的前序和中序序列回步驟1做遞迴操作
5.左右子樹不再存在結點時返回null
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
private
://需要傳入 前序、中序遍歷的陣列;乙個前序陣列的索引(記錄查詢每乙個子樹裡面的根節點);中序陣列中的子樹中的左右索引)
treenode*
buildtree
(vector<
int>
& preorder, vector<
int>
& inorder,
int preindex,
int inleftstart,
int inrightend)
//記錄中序遍歷中左子樹的結束索引,以及右子樹的開始索引
int inleftend = inindex ;
//不能為inindex -1 如果是0 -1 越界,
//如果這裡是inindex -1 下面的右子樹中的第三個引數為preindex + 1 + (inleftend - inleftstart + 1)
int inrightstart = inindex +1;
treenode* root =
newtreenode()
; root-
>val = val;
//構建左子樹 ,左子樹的preindex應該為原來的preindex+1的位置,
root-
>left =
buildtree
(preorder, inorder, preindex +
1,inleftstart, inleftend)
;
root-
>right =
buildtree
(preorder, inorder, preindex +1+
(inleftend - inleftstart )
, inrightstart, inrightend)
;return root;}}
;
劍指offer面試題7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class solution struct treenode reconstruct int l1,int r1,int l2 pr...
劍指Offer 面試題7 重建二叉樹
題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,輸入前序遍歷序列和中序遍歷,則重建如圖2.6所示的二叉樹並輸出它的頭節點。分析 前序遍歷 先根,再左,後右 中序遍歷 先左,再根,後右。那麼前序遍歷的第乙個是根,在中序遍歷中找到...
劍指offer 面試題7 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出二叉樹並輸出他的根節點。二叉樹的定義如下 public static class binarytreenode 在二叉樹的前序遍歷中,第乙個數字總...