思路:知道前序和中序求二叉树,我觉得主要是弄清前序序列和中序序列的长度区间。首先在前序里面找根节点,在中序里面找左右子树;在中序序列里面找到根节点所在的位置,求出左子树长度和右子树长度,然后递归建树。
TreeNode* reConstructBinaryTreeCore ( vector< int > pre, int preL, int preH, vector< int > vin, int inL, int inH)
{
if ( preL> preH|| inL> inH)
return NULL ;
TreeNode* root = new TreeNode ( pre[ preL] ) ;
int center = 0 ;
while ( center< inH&& vin[ center] != pre[ preL] )
center++ ;
int llen = center- inL;
int rlen = inH- center;
root-> left = reConstructBinaryTreeCore ( pre, preL+ 1 , preL+ llen, vin, inL, inL+ llen- 1 ) ;
root-> right = reConstructBinaryTreeCore ( pre, preH- rlen+ 1 , preH, vin, inH- rlen+ 1 , inH) ;
return root;
}
TreeNode* reConstructBinaryTree ( vector< int > pre, vector< int > vin) {
int prelen= pre. size ( ) ;
int vinlen= vin. size ( ) ;
if ( prelen== 0 || vinlen== 0 )
return NULL ;
return reConstructBinaryTreeCore ( pre, 0 , prelen- 1 , vin, 0 , vinlen- 1 ) ;
}