LeetCode—105. Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

For example, given

preorder =?[3,9,20,15,7]

inorder = [9,3,15,20,7]

Return the following binary tree:

? ? 3

? / \

? 9? 20

? ? /? \

? 15? 7


本題給定一棵二叉樹的前序排列和中序排列,要求構(gòu)造出這棵二叉樹。

前序排列的順序是:根節(jié)點(diǎn)——左節(jié)點(diǎn)——右節(jié)點(diǎn)

中序排列的順序是:左節(jié)點(diǎn)——根節(jié)點(diǎn)——右節(jié)點(diǎn)

因此設(shè)4個(gè)int型值,分別記錄當(dāng)前子樹的所有節(jié)點(diǎn)在前序、中序數(shù)列中位置。

若前序數(shù)列中某個(gè)值在中序數(shù)列中找到,則在中序數(shù)列中,前面的值是該節(jié)點(diǎn)左子樹的所有值(設(shè)有m個(gè)),后面的值是該節(jié)點(diǎn)右子樹的所有值(設(shè)有n個(gè))。那么,在前序數(shù)列中,該值的后m個(gè)是它的左子樹所有值,m到m+n個(gè)是它的右子樹的所有值。


class Solution {

public:

? ? TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {

? ? ? ? return work(preorder, inorder, 0, preorder.size()-1, 0, inorder.size()-1);

? ? }

? ? TreeNode* work(vector<int>& preorder, vector<int>&inorder, int preleft, int preright, int inleft, int inright){

? ? ? ? if(preleft>preright) return NULL;

? ? ? ? TreeNode *root = new TreeNode(preorder[preleft]);

? ? ? ? for(int k=inleft; k<=inright; k++){

? ? ? ? ? ? if(inorder[k]==preorder[preleft]){

? ? ? ? ? ? ? ? root->left = work(preorder, inorder, preleft+1, preleft+k-inleft, inleft, k-1);

? ? ? ? ? ? ? ? root->right = work(preorder, inorder, preleft+k-inleft+1, preright, k+1, inright);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return root;

? ? }

};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容