题目描述
代码
class Solution {
public:
//创建一个数组保存先序遍历的结果方便使用
vector<int>a;
//创建一个哈希,用中序遍历的结果为key,对应下标为val
unordered_map<int,int>b;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//把传进来的先序遍历结果数组赋值给a
a=preorder;
//用中序遍历的结果为key,对应下标为val循环插入哈希表中方便寻找下标
for(int i=0;i<a.size();i++)b[inorder[i]]=i;
//通过 c 函数递归返回创建的二叉树的根节点
//参数1为先序遍历的第一元素下标,先序遍历第一元素一定是根节点
//参数2为中序遍历第一元素下标
//中序遍历第一元素一定是二叉树最左侧的叶子节点或者左子树为空时的根节点
//参数3为中序遍历最后一个元素下标
//中序遍历第一元素一定是二叉树最右侧的叶子节点或者右子树为空时的根节点
return c(0,0,a.size()-1);
}
// c 函数的实例化
TreeNode*c(int val,int l,int r){
//递归的结束条件是左下标大于右下标,也可以理解为右下标小于左下标
//虽然是一个条件代表的是两种运行状态的结果
if(l>r)return nullptr;
//root为根节点,值是传进来的先序遍历的第一元素
TreeNode*root=new TreeNode(a[val]);
// i 是通过哈希找到的中序遍历中根节点数值对应的下标
//用来确定左子树右子树的个数,下标等信息
int i=b[a[val]];
//递归创建左右子树节点并返回给left和right
root->left=c(val+1,l,i-1);
root->right=c(i-l+val+1,i+1,r);
//返回根节点
return root;
}
};