您的位置:首页 > 其它

Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal

2017-02-03 10:25 537 查看
Given preorder and inorder traversal of a tree, construct the binary tree.

Note:

You may assume that duplicates do not exist in the tree.

s思路:

1. 理论上给定三种遍历的顺序就可以构造树本身,还是挺有趣的!

2. 给定inoder和preorder,我们每次从preorder取第一个数一定是root了,然后去inorder找到这个数,这样inorder中这个数左侧就是左子树,右侧就是右子树。即:利用preorder去找根节点,利用这个根节点去inorder找左右子树对应的sub vector,这样就可以recursive的构造树了。

3. 问题是,每次去inorder中找根节点,如果是从左往右,就很费事。可以用map来做

//方法1:recursive: 对每个subarray用left,right来限定其范围。所以,需要两组left/right分别对preorder和inorder来限定范围。
class Solution {
public:

TreeNode* helper(vector<int>& preorder, unordered_map<int,int>&mm,int preleft,int preright,int inleft,int inright){
//
if(preleft>preright) return NULL;
TreeNode* cur=new TreeNode(preorder[preleft]);
int mid=mm[preorder[preleft]];
cur->left=helper(preorder,mm,preleft+1,preleft+mid-inleft,inleft,mid-1);
cur->right=helper(preorder,mm,preleft+mid-inleft+1,preright,mid+1,inright);
return cur;
}

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
//
unordered_map<int,int> mm;
for(int i=0;i<inorder.size();i++)
mm[inorder[i]]=i;
return helper(preorder,mm,0,inorder.size()-1,0,inorder.size()-1);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode recursive
相关文章推荐