地址:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
思路:通过对先序遍历和中序遍历的遍历顺序分析,对于先序遍历,第一个节点一定是根节点,再定位到中序遍历中当前根节点的位置,可以将先序遍历拆分成两个子树的先序遍历,这样就可以利用递归将遍历集合一步步缩小,从而得到二叉树。
Code:
/**
* 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:
unordered_map<int,int> imap;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=preorder.size();
TreeNode *head=new TreeNode();
for(int i=0;i<n;++i)
imap[inorder[i]]=i;
if(n) DFS(preorder,0,n-1,0,head);
else head=NULL;
return head;
}
void DFS(vector<int>& preorder,int l,int r,int l1,TreeNode *p)
{
p->val=preorder[l];
if(l==r) return;
int t=imap[preorder[l]];
if(t>l1){
p->left=new TreeNode();
DFS(preorder,l+1,l+t-l1,l1,p->left);
}
if(l+t-l1+1<=r){
p->right=new TreeNode();
DFS(preorder,l+t-l1+1,r,t+1,p->right);
}
}
};