题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
具体二叉树遍历很多博客都有讲,不再详细描述。
前序遍历:根、左、右
中序遍历:左、根、右
因此,前序遍历的第一个节点为根节点,到中序遍历的序列中找到该根节点的位置,左侧为该根节点的左子树,右侧为其右子树。在前序遍历中对应找到两棵子树的前序遍历序列,即找到了左子树的前序遍历和中序遍历,右子树的前序遍历和中序遍历。可以递归完成。
用索引的方式找到对应的前序和中序遍历。
代码:
1 /** 2 * Definition for binary tree 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 { 12 public: 13 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) 14 { 15 int pS = 0,iS = 0; 16 int pE = pre.size(); 17 int iE = vin.size(); 18 return find(pre,vin,pS,pE,iS,iE); 19 } 20 TreeNode* find(vector<int> pre,vector<int> vin,int pS,int pE,int iS,int iE) 21 { 22 //getchar(); 23 TreeNode *root = new TreeNode(0); 24 int pos = -1; 25 if(pS == pE || iS == iE) 26 { 27 return NULL; 28 } 29 //cout << pre[0]<< endl; 30 for(int i = iS; i < iE; i++) 31 { 32 if(vin[i] == pre[pS]) 33 { 34 pos = i; 35 break; 36 } 37 } 38 if(pos == -1) 39 return NULL; 40 root->val = pre[pS]; 41 int offset = pos - iS; 42 root->left = find(pre,vin,pS + 1,pS + offset + 1,iS,pos); 43 root->right = find(pre,vin,pS + offset + 1,pE,pos + 1,iE); 44 return root; 45 } 46 };