leetcode_95.不同的二叉搜索树II

给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。

示例:

输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:

1         3      3      2       1
  \        /      /       /  \        \
   3    2     1      1    3       2
  /     /         \                       \
2    1           2                      3

解析:二叉搜索树的一大性质就是对于一个节点,它的左节点均比它小,它的右节点均比它大。
对于给定n个数字,选取任意一个数字,便可以得到它的左子树与右子树各自包含的数字,于是可以递归调用函数,分别构建左右子树,之后进行拼接。

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if(n<1) return {};
        return gt(1,n);
    }
    vector<TreeNode*> gt(int n,int m){
        if(n>m) return {nullptr};
        vector<TreeNode*> res;
        for(int i=n;i<=m;++i){
            auto left = gt(n,i-1);
            auto right = gt(i+1,m);
            for(auto l:left){
                for(auto r:right){
                    TreeNode* cur = new TreeNode(i);
                    cur->left = l;
                    cur->right = r;
                    res.push_back(cur);
                }
            }
        }
        return res;
    }
};
发布了112 篇原创文章 · 获赞 0 · 访问量 356

猜你喜欢

转载自blog.csdn.net/qq_37292201/article/details/103920611