前序的意思就是,树在遍历的时候,子树的根节点优先输出,
中序的意思就是,树在遍历的时候,子树的左节点优先输出,
后序的意思就是,树在遍历的时候,子树的右节点优先输出,
这样的话其实就有一个特性,前序的第一个节点一定为根节点,后序的最后一个节点一点为根节点。
当找到中序中根节点的位置时,其左边为左子树,右边为右子树,这样进行划分递归,就可建树
class Solution {
private:
unordered_map<int, int> mp;
public:
TreeNode* myBuildTree(vector<int> preorder, vector<int> inorder,int pl,int pr,int il,int ir){
if(pl > pr) return nullptr;
TreeNode* Root = new TreeNode(preorder[pl]);
int lnum = mp[preorder[pl]] - il;
int rnum = ir - mp[preorder[pl]];
// int inorder_root = index[preorder[preorder_root]];
Root->left = myBuildTree(preorder,inorder,pl+1,pl+lnum,il,il+lnum-1);
Root->right = myBuildTree(preorder,inorder,pl+lnum+1,pr,il+lnum+1,ir);
return Root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; ++i) {
mp[inorder[i]] = i;
}
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}
};