LINTCODE——前序遍历和中序遍历树构造二叉树
思路:
第一步:根据前序遍历可以得到树的根节点(root);
第二步:在中序遍历中找到(root)的所在位置,将中序数组划分成左右两个数组,对应左子树(left_tree)和右子树(right_tree);
第三步:同样的划分前序数组;
最后:递归结果就好了。。。。
class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
// write your code here
if(preorder.empty())
return NULL;
if(preorder.size() == 1)
return new TreeNode(preorder[0]);
//找到中间点在中序排列的位置
int mid = 0;
for(int i = 0 ; i < inorder.size() ; i++)
{
if(inorder[i] == preorder[0])
{
mid = i;
break;
}
}
//拆分中序遍历
vector<int> left_inorder( inorder.begin() , inorder.begin()+mid);
vector<int> right_inorder(inorder.begin()+mid+1 , inorder.end());
int L = left_inorder.size() ;
//根据中序遍历的左边长度,拆分前序遍历;
vector<int> left_preorder(preorder.begin()+1 ,preorder.begin()+L+1);
vector<int> right_preorder(preorder.begin()+L+1 ,preorder.end());
//递归生产树
TreeNode *root = new TreeNode(inorder[mid]);
root -> left = buildTree(left_preorder , left_inorder);
root -> right = buildTree(right_preorder , right_inorder);
return root;
}
};