leetcode-105. 从前序与中序遍历序列构造二叉树
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: unordered_map<int,int> in_map; vector<int> pre_order; TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.size()==0) return NULL; cout<<"flag"<<endl; for(int i = 0; i < inorder.size(); i++){ in_map[inorder[i]] = i; pre_order.push_back(preorder[i]); } return recur(0,0,inorder.size()-1); } // pre:在先序遍历中的跟节点的下标。 // left:在中序遍历中的左边界 // right:在中序遍历中的右边界 TreeNode* recur(int pre,int left,int right){ if(left>right) return NULL; int mid = in_map[pre_order[pre]]; // cout<<"mid"<<mid<<endl; // cout<<"pre_order[pre]:"<<pre_order[pre]<<endl; TreeNode* root = new TreeNode(pre_order[pre]); root->left = recur(pre+1,left,mid-1); root->right = recur(pre+(mid-left)+1,mid+1,right); return root; } };