105. Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:淘宝店铺韩版女装货源 编辑:程序博客网 时间:2024/05/22 13:56

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 a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {        return Create(preorder, 0, preorder.size(),inorder,0, inorder.size());    }    TreeNode* Create(vector<int>& preorder, int pre_i,int pre_j,vector<int>& inorder,int in_i,int in_j)    {        if(pre_i>=pre_j||in_i>=in_j) return NULL;                int mid=preorder[pre_i];        auto mid_i=find(inorder.begin()+in_i,inorder.begin()+in_j,mid);        int dis=mid_i-inorder.begin()-in_i;                TreeNode* root=new TreeNode(mid);        root->left=Create(preorder, pre_i+1,pre_i+1+dis,inorder,in_i,in_i+1+dis);        root->right=Create(preorder, pre_i+1+dis,pre_j,inorder,in_i+1+dis,in_j);        return root;    }};

O(n)(19ms) solution without recusion.

/** * 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:    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {        TreeNode *root=NULL; stack<TreeNode *> MyData;        if(preorder.empty()) return root;        root = new TreeNode(preorder[0]);        MyData.push(root); int index = 0;        for(int i=1; i<=preorder.size(); i++) {            TreeNode *cur = MyData.top();            if((MyData.top()->val)!=inorder[index]) {                cur->left = new TreeNode(preorder[i]);                MyData.push(cur->left);            } else {                while(!MyData.empty() && ((MyData.top()->val)==inorder[index])) {                    cur=MyData.top(); MyData.pop(); index++;                 }                if(index<inorder.size()) {                    cur->right = new TreeNode(preorder[i]);                    MyData.push(cur->right);                }             }          }        return root;    }};





0 0