leetcode - 构造二叉树(前序+中序、后序+中序、前序+后序)

  • 前序+中序

    //除了叶子节点,其他所有的节点都有左右孩子的二叉树才能被先序和后序数组重构出来
    class Solution {
    public:
        unordered_map<int, int> pos;
        TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& in) {
            if(pre.empty() or in.empty()) return nullptr;
            int n = pre.size();
            for(int i = 0; i < n; ++ i) pos[in[i]] = i;
            return buildSubtree(pre, 0, n - 1, in, 0, n - 1);
        }
    
        TreeNode* buildSubtree(vector<int>& pre, int l, int r, vector<int>& in, int i, int j)
        {
            if(l > r) return nullptr;
            TreeNode* root = new TreeNode(pre[l]);
            int mid = pos[pre[l]];
            int k = mid - i; //左子树长度
            root -> left = buildSubtree(pre, l + 1, l + 1 + k, in, i, mid);
            root -> right = buildSubtree(pre, l + k + 2, r, in, mid + 1, j);
            return root;
        }
    };
  • 后序+中序

    //除了叶子节点,其他所有的节点都有左右孩子的二叉树才能被先序和后序数组重构出来
    class Solution {
    public:
        unordered_map<int, int> pos;
        TreeNode* constructFromPrePost(vector<int>& in, vector<int>& post) {
            if(in.empty() or post.empty()) return nullptr;
            int n = in.size();
            for(int i = 0; i < n; ++ i) pos[in[i]] = i;
            return buildSubtree(in, 0, n - 1, post, 0, n - 1);
        }
    
        TreeNode* buildSubtree(vector<int>& in, int i, int j, vector<int>& post, int l, int r)
        {
            if(l > r) return nullptr;
            TreeNode* root = new TreeNode(pre[r]);
            int mid = pos[in[r]];
            int k = mid - i;
            root -> left = buildSubtree(in, i, mid, post, l, l + k);
            root -> right = buildSubtree(in, mid + 1, j, post, l + k + 1, r - 1);
            return root;
        }
    };
  • 前序+后序

    //除了叶子节点,其他所有的节点都有左右孩子的二叉树才能被先序和后序数组重构出来
    class Solution {
    public:
        unordered_map<int, int> pos;
        TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
            if(pre.empty() or post.empty()) return nullptr;
            int n = pre.size();
            for(int i = 0; i < n; ++ i) pos[post[i]] = i;
            return buildSubtree(pre, 0, n - 1, post, 0, n - 1);
        }
    
        TreeNode* buildSubtree(vector<int>& pre, int l, int r, vector<int>& post, int i, int j)
        {
            if(l > r) return nullptr;
            TreeNode* root = new TreeNode(pre[l]);
            if(l == r) return root;
            int mid = pos[pre[l + 1]];
            root -> left = buildSubtree(pre, l + 1, l + 1 + mid - i, post, i, mid);
            root -> right = buildSubtree(pre, l + mid - i + 2, r, post, mid + 1, j - 1);
            return root;
        }
    };

猜你喜欢

转载自www.cnblogs.com/xiaobaizzz/p/12333357.html