LeetCode——95. 不同的二叉搜索树 II

发布时间 2023-10-05 23:33:18作者: Sky6634

本次博客,我将记录leetcode95,不同的二叉搜索树

95. 不同的二叉搜索树 II

image

本题要求我们从1~n构造不同的二叉搜索树

因为好久不碰数据结构了,导致对二叉搜索树的概念十分模糊

以下是一些概念:

二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
性质如下:
1.非空左子树的所有键值小于其根结点的键值。
2.非空右子树的所有键值大于其根结点的键值。
3.左、右子树都是二叉搜索树。

本题关键点在于构造出所有不同的二叉搜索树,因此对于当前节点i,我们可以将其一分为二,即1~i-1i+1~n两部分,这两部分分别作为当前i节点的左子树和右子树

我们只需对每个i分别构造出其左子树和右子树,然后再将其拼接到当前节点的leftright子节点

代码如下:

/**
 * 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:
    vector<TreeNode*> dfs(int x, int n){
        if(x>n){
            return {nullptr};
        }
        vector<TreeNode*> res;
        for(int i=x;i<=n;i++){
            vector<TreeNode*> ltree = dfs(x, i-1);
            vector<TreeNode*> rtree = dfs(i+1, n);
            for(auto& left:ltree){
                for(auto& right:rtree){
                    TreeNode* currTree = new TreeNode(i);
                    currTree->left = left;
                    currTree->right = right;
                    res.push_back(currTree);
                }
            }
        }
        return res;
    }
    vector<TreeNode*> generateTrees(int n) {
        return dfs(1, n);
    }
};