【leetcode】二叉树的构造题目总结

发布于:2024-05-09 ⋅ 阅读:(35) ⋅ 点赞:(0)

108. 将有序数组转换为二叉搜索树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* travesal(vector<int>& nums, int left, int right) {
        if (left > right) return nullptr;
        int mid = left + (right - left) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = travesal(nums, left, mid - 1);
        root->right =  travesal(nums, mid + 1, right);
        return root;
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return travesal(nums, 0, nums.size() - 1);
    }
};

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

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    unordered_map<int, int> index;
    TreeNode* travesal(vector<int>& preorder, int prestart, int preend,
        vector<int>& inorder, int instart, int inend) {

        if (instart > inend) return nullptr;

        int rootVal = preorder[prestart];
        TreeNode* root = new TreeNode(rootVal);

        int rootIndex = index[rootVal];
        int leftLen = rootIndex - instart;

        root->left = travesal(preorder, prestart + 1, prestart + leftLen, inorder, instart, rootIndex - 1);
        root->right = travesal(preorder, prestart + leftLen + 1, preend, inorder, rootIndex + 1, inend);
        return root;
    }

    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for (int i = 0; i < inorder.size(); ++i) {
            index[inorder[i]] = i;
        }
        return travesal(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
    }
};

106. 从中序与后序遍历序列构造二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    unordered_map<int, int> index;
    TreeNode* myBuildTree(vector<int>& inorder, int instart, int inend,
        vector<int>& postorder, int poststart, int postend) {
        if (instart > inend) return nullptr;

        int rootVal = postorder[postend];
        int inIndex = index[rootVal];
        int leftSize = inIndex - instart;

        TreeNode* root = new TreeNode(rootVal);
        root->left = myBuildTree(inorder, instart, inIndex - 1, postorder, poststart, poststart + leftSize - 1);
        root->right = myBuildTree(inorder, inIndex + 1, inend, postorder, poststart + leftSize, postend - 1);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        for (int i = 0; i < inorder.size(); ++i) {
            index[inorder[i]] = i;
        }
        return myBuildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
    }
};

889. 根据前序和后序遍历构造二叉树

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    unordered_map<int, int> index;
    TreeNode* myConstructFromPrePost(vector<int>& preorder, int prestart, int preend, 
        vector<int>& postorder, int poststart, int postend) {
        if (prestart > preend) return nullptr;
        if (prestart == preend) {
            return new TreeNode(preorder[prestart]);
        }

        int rootVal = preorder[prestart];
        int leftVal = preorder[prestart + 1];
        int postIndex = index[leftVal];
        int leftSize = postIndex - poststart + 1;

        TreeNode* root = new TreeNode(rootVal);
        root->left = myConstructFromPrePost(preorder, prestart + 1, prestart + leftSize, postorder, poststart, postIndex);
        root->right = myConstructFromPrePost(preorder, prestart + leftSize + 1, preend, postorder, postIndex + 1, postend - 1);
        return root;
    }

    TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {
        for (int i = 0; i < postorder.size(); ++i) {
            index[postorder[i]] = i;
        }
        return myConstructFromPrePost(preorder, 0, preorder.size() - 1, postorder, 0, postorder.size() - 1);
    }
};


网站公告

今日签到

点亮在社区的每一天
去签到