*剑指Offer07 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
前序遍历第一个数即为当前的根节点,再根据该节点的值可以在中序遍历中划分出左子树和右子树,递归下去就可以重建二叉树。
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 n=preorder.size(); 14 if(!n) return nullptr; 15 int* ptrpreorder=&preorder[0]; 16 int* ptrinorder=&inorder[0]; 17 return Construct(ptrpreorder,ptrpreorder+n-1,ptrinorder,ptrinorder+n-1); 18 } 19 20 TreeNode* Construct(int* startpreorder, int* endpreorder, int* startinorder, int*endinorder){ 21 int rootval=startpreorder[0]; 22 TreeNode* curroot= new TreeNode(); 23 curroot->val=rootval; 24 curroot->left=curroot->right=nullptr; 25 26 if(startpreorder==endpreorder){ 27 if(startinorder==endinorder && *startpreorder==*startinorder) 28 return curroot; 29 } 30 31 int* rootinorder=startinorder; 32 while(rootinorder<=endinorder && *rootinorder!=rootval) 33 rootinorder++; 34 35 int leftlen=0,rightlen=0; 36 leftlen=rootinorder-startinorder; 37 int* leftendpreorder=startpreorder+leftlen; 38 if(leftlen){ 39 curroot->left=Construct(startpreorder+1,leftendpreorder,startinorder,rootinorder-1); 40 } 41 42 if(rootinorder!=endinorder){ 43 curroot->right=Construct(leftendpreorder+1,endpreorder,rootinorder+1,endinorder); 44 } 45 return curroot; 46 } 47 };
第二次做,加入了用全局变量记录错误信息。
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 11 enum{Valid,InValid}; 12 int g_buildTree=Valid; 13 14 class Solution { 15 public: 16 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 17 int n=preorder.size(); 18 if(n!=inorder.size() || !n){ 19 g_buildTree=InValid; 20 return nullptr; 21 } 22 TreeNode* root= recursive_build(preorder,inorder,0,n-1,0,n-1); 23 return root; 24 } 25 26 TreeNode* recursive_build(vector<int>& preorder, vector<int>& inorder, int startpre, int endpre, int startin, int endin){ 27 if(startpre==endpre){ 28 TreeNode* leaf=new TreeNode(preorder[startpre]); 29 return leaf; 30 } 31 32 TreeNode* curroot=new TreeNode(preorder[startpre]); 33 int leftlen=0; 34 for(int i=startin;i<=endin;++i){ 35 if(inorder[i]==preorder[startpre]){ 36 leftlen=i-startin; 37 break; 38 } 39 } 40 41 if(leftlen){ 42 curroot->left=recursive_build(preorder,inorder,startpre+1,startpre+leftlen,startin,startin+leftlen-1); 43 } 44 if(startpre+leftlen!=endpre){ 45 curroot->right=recursive_build(preorder,inorder,startpre+leftlen+1,endpre,startin+leftlen+1,endin); 46 } 47 48 return curroot; 49 } 50 51 52 53 };