給定乙個二叉樹前序遍歷陣列a 124367,中序遍歷得到陣列b, 421637。我們的任務是從這兩個結果中構造出原來二叉樹。
根據前序遍歷的順序,可以知道陣列是先存放根,然後是左子樹,最後是右子樹。
根據中序遍歷的順序,可以知道陣列是先放左子樹,然後是根,最後是右子樹。
根據定義,前序遍歷陣列第乙個位置是根節點,但左子樹和右子樹大小未知。而中序遍歷一旦確定根的位置,就可以確定左右子樹的大小。這兩者剛好是互補關係。
因此具體過程是
對於本問題,就是1將421637分成42和637,這意味著左子數大小為2,右子數大小為3.於是124367被分成1,24,367.
24和42是新的左子樹問題,367和637是新的右子樹問題。
理清思路之後,我們可以按照遞迴模版四步走起來
第零步:思考函式名和傳遞的引數和全域性變數。根據我們的分析,我們最重要的就是子問題對應陣列的區間,也就是我們需要記錄前序陣列的左右子樹開始和結束(pb, pe), 中序陣列的開始和結束(ib, ie), 函式名的話,就寫dc吧
第一步:終止條件。這裡終止條件是前序陣列用完了(當然中序陣列肯定也用完了)
if (pb > pe) return null;
第二步: 處理邏輯。每次用前序節點的第乙個位置構建根節點,然後拆分中序節點,獲取左右子樹的大小,
treenode *root = new treenode(preorder[pb]);
int rootindex = mp[root->val]; //獲取中序的位置
int leftsize = rootindex - ib; //左子樹大小
int rightsize = ie - rootindex; //右
第三步,下潛一層, 新的一層要帶新的引數過去。
root->left = dc(preorder,pb+1,pb+leftsize, inorder,ib, rootindex-1);
root->right = dc(preorder,pb+leftsize+1, pe, inorder, rootindex+1, ie);
第四步:狀態重置。此處不需要
最終返回root即可。
對應的完成**見
leetcode 105 前序,中序建樹
有簡潔版的。可是懶得看。自己寫的這個算是模擬手痠過程了吧,恩。感覺碰到這樣的例子,就是涉及長度加減的,都要拿小資料測一測。class solution int mid 1 for int i ll i rr i if inorder i root val root left find l 1,l m...
LeetCode105 前序 中序構造樹
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。前序拿到根節點,在中序中找到該節點左邊的元素和右邊的元素,遞迴下去.public class offer 07 else if index inorderend 1 else return root 看了官方的遞迴解法,思...
LeetCode 105和106 重建二叉樹
ps和pe是前序遍歷的起始和終止位置,is和ie則是中序遍歷的起始和終止位置 treenode create vector preorder,vector inorder,int ps,int pe,int is,int ie pos is表示在中序遍歷中根節點左邊 左子樹 元素的個數 ie pos...