Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:ubuntu 设置mac 编辑:程序博客网 时间:2024/05/17 06:09

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);    }};
0 0