Description:
题目大意:利用前序遍历和中序遍历构造二叉树。
解题思路:
算法标签:二叉树,递归
- 构建中序遍历元素和下标的映射
- 利用前序遍历的特性,第一个点便是根节点
- 然后根据根节点在中序遍历中找到对应的下标
- 下标左边的构造左子树,下标右边的构造右子树
代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// 中序遍历值和下标建立映射
map<int , int>inorder;
TreeNode* built(vector<int> &pre , int pl ,int pr ,vector<int> & in, int inl , int inr) {
if(pl > pr || inl > inr)
return nullptr;
if(pl == pr || inl == inr) {
return new TreeNode(pre[pl]);
}
// 前序遍历第一个元素就是根节点
TreeNode* root = new TreeNode(pre[pl]);
// 找到根节点在中序遍历中的下标
int index = inorder[pre[pl]];
// 生成左子树
int leftsize = index - inl;
root -> left = built(pre , pl + 1, pl + leftsize , in ,inl ,index - 1);
// 生成右子树
root -> right = built(pre, pl + leftsize + 1 , pr , in , index + 1, inr);
return root;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size() == 0 || vin.size() == 0)
return nullptr;
for(int i = 0;i < vin.size();i++)
inorder.insert(pair<int , int>(vin[i] , i));
return built(pre , 0 ,pre.size() - 1 , vin , 0 , vin.size() - 1);
}
};