leetcode--105. 从前序与中序遍历序列构造二叉树

  1. 从前序与中序遍历序列构造二叉树
    根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

   3
  / \
 9  20
   /  \
  15   7
/**
 * 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 len1 = preorder.size(), len2 = inorder.size();
        if (len1 == 0 && len2 == 0){
            return NULL;
        }
        return treeBuild(preorder, 0, inorder, 0, len2-1);
    }
    TreeNode* treeBuild(vector<int>& preorder, int left1, vector<int>& inorder, int left2, int right2){
        if (left2 == right2){
            TreeNode* root = new TreeNode(preorder[left1]);
            return root;
        } 
        TreeNode* root = new TreeNode(preorder[left1]);
        int i = left2;
        for (; i<=right2; i++){
            if (inorder[i] == preorder[left1]){
                break;
            }
        }
        if (left2 <= i-1){
            root->left = treeBuild(preorder, left1+1, inorder, left2, i-1);
        }
        if (i+1 <= right2){
            root->right = treeBuild(preorder, left1+i-left2+1, inorder, i+1, right2);
        }  
        return root;
    }
};
/*32ms,25.9MB*/

时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int pos = 0;
        return buildTree(preorder, pos, inorder, 0, inorder.size()-1);
    }

    TreeNode* buildTree(vector<int>& preorder, int& pos, vector<int>& inorder, int left, int right) {
        if (pos >= preorder.size()) return 0;
        int i = left;
        for (i = left; i <= right; ++i) {
            if (inorder[i] == preorder[pos]) break;
        }
        TreeNode* node = new TreeNode(preorder[pos]);
        if (left <= i-1) node->left = buildTree(preorder, ++pos, inorder, left, i-1);  // 左子树,++pos之后pos = pos + 1
        if (i+1 <= right) node->right = buildTree(preorder, ++pos, inorder, i + 1, right);  // 右子树,在上面的pos基础上再+1
        return node;
    }
};

作者:yuexiwen
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/c-fen-zhi-by-yuexiwen/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发布了59 篇原创文章 · 获赞 0 · 访问量 1204

猜你喜欢

转载自blog.csdn.net/u011861832/article/details/104547399