105. Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:下载电驴软件 编辑:程序博客网 时间:2024/04/27 23:17

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

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

1.我的首先想法(递归建树) 但是超时了 

/** * 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) {        int prelen = preorder.size(), inlen = inorder.size();        if(prelen == 0 && inlen == 0)        return NULL;        if(prelen == 1 && inlen == 1){            int res = preorder.front();            TreeNode* temp = new TreeNode(res);            temp->left = NULL;            temp->right = NULL;            return temp;        }        int rootnum = preorder.front();        TreeNode* root = new TreeNode(rootnum);        int i = 0;        for(; i < inlen; i++){            if(inorder[i] == rootnum)                break;        }        vector<int> pre_left(preorder.begin()+1,preorder.begin()+i+1);        vector<int> pre_right(preorder.begin()+1+i,preorder.end());        vector<int> in_left(inorder.begin(), inorder.begin()+i);        vector<int> in_right(inorder.begin()+i+1,inorder.end());        root->left = buildTree(pre_left, in_left);        root->right = buildTree(pre_right, in_right);        return root;    }    };

2.对以上的改写(之前这里超时,后来找到原因是因为:createTree函数里面的两个vector没有加引用&,我也不知道为什么没加就超时了,加了以后就好了)

/** * 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) {        int prelen = preorder.size(), inlen = inorder.size();        if(prelen == 0 && inlen == 0)        return NULL;        return createTree(preorder, inorder, 0, prelen-1, 0, inlen-1);    }        TreeNode* createTree(vector<int>& preorder, vector<int>& inorder, int pre_begin, int pre_end, int in_begin, int in_end){        if(pre_end < pre_begin || in_end < in_begin)        return NULL;        int rootnum = preorder[pre_begin];        TreeNode* root = new TreeNode(rootnum);        int i = in_begin;        for(; i <= in_end; i++){            if(inorder[i] == rootnum)                break;        }        root->left = createTree(preorder, inorder, pre_begin+1, pre_begin+(i-in_begin), in_begin, i-1);        root->right = createTree(preorder, inorder, pre_begin+(i-in_begin)+1, pre_end, i+1, in_end);        return root;       }};

3.别人的解法 迭代(还没看懂)

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