Sunday, September 1, 2013

Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
  TreeNode* getnode(int x)
{
    TreeNode *t = (TreeNode *)malloc(sizeof(TreeNode));
    t->val = x;
    t->left =  NULL;
    t->right = NULL;
    return t;
}

TreeNode *buildTree(vector<int> &preorder, int pi, int pj, vector<int> &inorder, int ii, int ij)
{
    if(pi > pj)
        return NULL;
    TreeNode* root  = getnode(preorder[pi]);
    // find the index of number preorder[pi] in inorder
    int i = 0;
    for(i  = ii; i <= ij; i++)
    {
        if(preorder[pi] == inorder[i])
            break;
    }
    
    // count of elements in first half  
    int left  = (i - 1) - ii + 1;
    
    root->left = buildTree(preorder, pi+1, pi + left, inorder, ii, ii + left -1);
    root->right = buildTree(preorder, pi+ left + 1, pj, inorder, ii + left + 1, ij);
    
    return root;
    
}

TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    if(preorder.size() <= 0)
        return NULL;
    return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};

No comments:

Post a Comment