1. 程式人生 > 實用技巧 >LeetCode105 從前序遍歷和中序遍歷構造二叉樹

LeetCode105 從前序遍歷和中序遍歷構造二叉樹

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

遞迴,根據前序遍歷當前有效區域第一個,即為當前根節點;找到中序遍歷中它的位置,左側為左節點,右側為右節點。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10
class Solution { 11 public: 12 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 13 int len=preorder.size(); 14 //preorder.size()!=inorder.size(), set global variable 15 return recursive_build(preorder,0,len-1,inorder,0,len-1); 16 } 17
18 TreeNode* recursive_build(vector<int>& preorder, int startpre, int endpre, vector<int>& inorder, int startin, int endin){ 19 if(startpre>endpre) 20 return nullptr; 21 if(startpre==endpre) 22 return new TreeNode(preorder[startpre]);
23 int rootval=preorder[startpre]; 24 int posin=startin; 25 while(inorder[posin]!=rootval && posin<=endin) 26 ++posin; 27 //posin>endin, set g_variable 28 TreeNode* curNode=new TreeNode(rootval); 29 int leftlen=posin-startin; 30 curNode->left=recursive_build(preorder,startpre+1,startpre+leftlen,inorder,startin,posin-1); 31 curNode->right=recursive_build(preorder,startpre+leftlen+1,endpre,inorder,posin+1,endin); 32 return curNode; 33 } 34 };