1.前序中序确定
class Solution { public: TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { if(preorder.size()==0||inorder.size()==0||preorder.size()!=inorder.size())return NULL; TreeNode *root=NULL; build(root,preorder,inorder,0,preorder.size()-1,0,inorder.size()-1); return root; } void build(TreeNode *&root,vector<int> &preorder, vector<int> &inorder,int p1,int p2,int i1,int i2) { root=new TreeNode(preorder[p1]); int j; for(j=i1;j<=i2;j++) { if(inorder[j]==preorder[p1])break; } if(j!=i1) build(root->left,preorder,inorder,p1+1,p1+j-i1,i1,j-1); if(j!=i2) build(root->right,preorder,inorder,p1+(j-i1)+1,p2,j+1,i2); } };
2.中序和后序确定
class Solution { public: TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { if(postorder.size()==0||inorder.size()==0||inorder.size()!=postorder.size())return NULL; TreeNode *root=NULL; build(root,inorder,postorder,0,inorder.size()-1,0,postorder.size()-1); return root; } void build(TreeNode *&root,vector<int> &inorder, vector<int> &postorder,int i1,int i2,int p1,int p2) { root=new TreeNode(postorder[p2]); int j; for(j=i1;j<=i2;j++) { if(inorder[j]==postorder[p2])break; } if(j!=i1) build(root->left,inorder,postorder,i1,j-1,p1,p1+j-1-i1); if(j!=i2) build(root->right,inorder,postorder,j+1,i2,p1+j-i1,p2-1); } };