/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//时间复杂度o(n);递归遍历。
//建立哈希表存储 根节点所在前序遍历的下标
unordered_map<int,int> pos;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//前序遍历 是根 左 右
//中序遍历 是左 根 右
int n=preorder.size();//简便书写
for(int i=0;i<n;i++) pos[inorder[i]]=i;
return dfs(preorder,inorder,0,n-1,0,n-1); //用递归求解
}
TreeNode* dfs(vector<int>&pre,vector<int>&in,int pl,int pr,int il,int ir) //参数分别为前、中序遍历,前、中序左右端点
{
if(pl>pr) return NULL;
int k=pos[pre[pl]]-il; //这样设置,方便左端点+K直接为右端点,省下了+1-1的麻烦,记住pos是中序遍历里的hasp表
TreeNode *root=new TreeNode(pre[pl]);
root->left=dfs(pre,in,pl+1,pl+k,il,il+k-1);//左子树前序遍历 从PL+1到pl+k,中序遍历从 il到il+k-1;
root->right=dfs(pre,in,pl+k+1,pr,il+k+1,ir);//右子树前序遍历 从pl+k+1到pr,中序遍历从 il+k+1到ir
return root;
}
};
剑指offer 18.重建二叉树
最新推荐文章于 2024-06-18 05:10:51 发布