1. 由中序和后续构造二叉树


/** * 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: int pos; // 后序遍历,根节点index unordered_map<int, int> mp; // 中序遍历, val->index TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { pos = (int)postorder.size() - 1; for (int i = 0; i < inorder.size(); i++) { mp[inorder[i]] = i; } return dfs(0, pos, postorder); } // left, right 是中序的index TreeNode* dfs(int left, int right, vector<int>& postorder) { if (left > right) { return nullptr; } int rootVal = postorder[pos]; TreeNode* root = new TreeNode(rootVal); int inIndex = mp[rootVal]; // 根节点在中序的位置 pos--; root->right = dfs(inIndex + 1, right, postorder); root->left = dfs(left, inIndex - 1, postorder); return root; }};