Construct Binary Tree from Preorder and Inorder Traversal

来源:互联网 发布:java面试造假 编辑:程序博客网 时间:2024/06/05 08:26

递归,时间复杂度O(n)(此处有疑问?),空间复杂度O(logN)。代码如下:

class Solution {public:    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {        return buildTree1(preorder, inorder, 0, 0, preorder.size());    }        TreeNode *buildTree1(vector<int> &preorder, vector<int> &inorder, int begin1, int begin2, int len) {        if(len == 0) return NULL;                TreeNode *left, *right, *rootNode;        int root = preorder[begin1];        int index = begin2;        for(; index<begin2+len; ++index) {            if(inorder[index] == root) {                rootNode = new TreeNode(root);                rootNode->left = buildTree1(preorder, inorder, begin1+1, begin2, index-begin2);                rootNode->right= buildTree1(preorder, inorder, begin1+(index-begin2)+1,  index+1, len-(index-begin2)-1);                return rootNode;            }        }    }};

9.02最新代码: 注意细节,数组边界条件

class Solution {public:    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {        const int n = preorder.size();        if(n == 0) return NULL;        return build(preorder, inorder, 0, 0, n);    }        TreeNode *build(vector<int> &preorder, vector<int> &inorder, int sp, int si, int len)    {        if(len<=0) return NULL;                TreeNode *root = new TreeNode(preorder[sp]);                for(int i=0; i<len; i++)        {            if(preorder[sp] == inorder[si+i])            {                root->left = build(preorder, inorder, sp+1, si, i);                root->right = build(preorder, inorder, sp+i+1, si+i+1, len-i-1);                return root;            }        }    }};


0 0