/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ classSolution { public:
map<int,int> hash;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder){ int n = preorder.size(); for (int i = 0; i < n; ++ i) hash[inorder[i]] = i; returndfs(preorder, inorder, 0, n - 1, 0, n - 1); }
/** * 整理思维: * 1. 根据前序遍历性质,根左右,第一个就是根节点 * 2. 根据中序遍历性质,划分左右子树, 递归处理 * 3. 只要存在左/右子树,左/右子树起始区间一定小于等于左/右子树结尾区间 */ TreeNode* dfs(vector<int>&pre, vector<int>&in, int pl, int pr, int il, int ir) { if (pl > pr) returnnullptr; auto *root = newTreeNode(pre[pl]); int k = hash[pre[pl]]; root -> left = dfs(pre, in, pl + 1, pl + k - il, il, k - 1); root -> right = dfs(pre, in, pl + k - il + 1, pr, k + 1, ir); return root; } }