思路:先序的第一个元素和后序的最后一个元素是当前子树的根,然后遍历中序序列,找到左右子树的分界线,递归建左子树和右子树。
class Solution { public: /*由于是oj,这里假设给的序列是合法的,正常情况是需要判断不合法情况的 */ TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder,int instart,int inend,int poststart,int postend) { TreeNode* root = new TreeNode(postorder[postend]); if(instart == inend && poststart == postend && instart == poststart)return root; int i; for(i = instart;i <= inend;++i) { if(inorder[i] == postorder[postend])break;//找到中序的根节点 } if(i > instart)root -> left = buildTree(inorder,postorder,instart,i - 1,poststart,poststart + (i - instart - 1)); if(i < inend) root -> right = buildTree(inorder,postorder,i + 1,inend,poststart + i - instart,postend - 1); return root; } TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) { int inlength = inorder.size(),postlength = postorder.size(); if( inlength == 0 || inlength != postlength ) return NULL; return buildTree(inorder,postorder,0,inlength-1,0,postlength-1); } }; class Solution { public: TreeNode *buildTree(vector<int>& preorder,vector<int> &inorder,int prestart,int preend,int instart,int inend) { TreeNode* root = new TreeNode(preorder[prestart]); if(instart == inend && prestart == preend && instart == prestart)return root; int i; for(i = instart;i <= inend;++i) { if(inorder[i] == preorder[prestart])break;//找到中序的根节点 } if(i > instart)root -> left = buildTree(preorder,inorder,prestart+1,prestart + i - instart,instart,i - 1); if(i < inend) root -> right = buildTree(preorder,inorder,prestart + i - instart + 1,preend,i + 1,inend); return root; } TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { int prelength = preorder.size(),inlength = inorder.size(); if( inlength == 0 || inlength != prelength ) return NULL; return buildTree(preorder,inorder,0,prelength-1,0,inlength-1); } };
原文地址:http://blog.csdn.net/fangjian1204/article/details/38496567