【剑指offer】重建二叉树
题目链接:重建二叉树
题意:根据前序和中序建二叉树
题解:数据结构里大家做前序中序建二叉树的题应该很熟了。这个题就是将思考过程用代码模拟一遍。
前序数组的第一个节点pre[0]就是根节点 ,在中序数组中找到这个根节点,以此划分左子树和右子树。
递归遍历到叶节点即可。
代码:
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 public: 12 TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { 13 int len = pre.size(); 14 if(len == 0) return NULL; 15 16 vector<int> left_pre,right_pre,left_vin,right_vin; 17 TreeNode* tree = new TreeNode(pre[0]); 18 int root = 0; 19 for(int i = 0; i < len; i++){ 20 if(pre[0] == vin[i]){//根结点在中序中的位置 21 root = i; 22 break; 23 } 24 } 25 //左子树 26 for(int i = 0 ;i < root ;i++){ 27 left_pre.push_back(pre[i+1]); 28 left_vin.push_back(vin[i]); 29 } 30 //右子树 31 for(int i = root+1; i < len ;i++){ 32 right_pre.push_back(pre[i]); 33 right_vin.push_back(vin[i]); 34 } 35 //递归遍历 36 tree->left=reConstructBinaryTree(left_pre,left_vin); 37 tree->right=reConstructBinaryTree(right_pre,right_vin); 38 return tree; 39 } 40 };