lintcode:Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:火车票在线制作软件 编辑:程序博客网 时间:2024/05/12 00:01

Given preorder and inorder traversal of a tree, construct the binary tree.

 Notice

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

Example

Given in-order [1,2,3] and pre-order [2,1,3], return a tree:

  2 / \1   3

/** * Definition of TreeNode: * class TreeNode { * public: *     int val; *     TreeNode *left, *right; *     TreeNode(int val) { *         this->val = val; *         this->left = this->right = NULL; *     } * } */ class Solution {    /**     *@param preorder : A list of integers that preorder traversal of a tree     *@param inorder : A list of integers that inorder traversal of a tree     *@return : Root of a tree     */private:    TreeNode *buildTreeHelper(vector<int> &preorder, int start1, int end1, vector<int> &inorder, int start2, int end2) {                if (end1 < start1 || end2 < start2)            return NULL;                TreeNode *root = new TreeNode(preorder[start1]);                int rootIdx = start2;        int offset = 0; //这个offset的概念很重要        for (; rootIdx <= end2; rootIdx++)         {            if (inorder[rootIdx] == preorder[start1])                break;            offset++;        }        //start1+rootIdx是错误的,对于左边来说,应该是start1+offset;        root->left = buildTreeHelper(preorder, start1+1, start1+offset, inorder, start2, rootIdx-1);        root->right = buildTreeHelper(preorder, start1+offset+1, end1, inorder, rootIdx+1, end2);                 return root;    }     public:    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {        // write your code here                return buildTreeHelper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);       }};


0 0