95. Unique Binary Search Trees II

95. Unique Binary Search Trees II

给定 N ,生成所有含有节点 1-N 的二叉搜索树序列

每一个值都可以做为根,递归分治,让左边的元素组成左子树,右边的元素组成右子树,将问题的规模进一步减小

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n==0) return vector<TreeNode*>();
        return genTree(1, n);
    }
    
    vector<TreeNode*> genTree(int start, int end) {
		// start ~ end 的所有生成树
        vector<TreeNode*> tree_list;
        if (start>end) tree_list.push_back(NULL);
        
        for(int i=start;i<=end;++i) {
			// 每一个都可以作为根
			// 递归生成左子树
            vector<TreeNode*> left = genTree(start, i-1);
			// 递归生成右子树
            vector<TreeNode*> right = genTree(i+1, end);

			// 左右子树以 i 为根可以组合处很多棵树
            for(auto lnode : left) {
                for(auto rnode : right) {
                    TreeNode* root = new TreeNode(i);
                    root->left = lnode;
                    root->right = rnode;
					// 添加进结果并返回
                    tree_list.push_back(root);
                }
            }
        }
        return tree_list;
    }
};

#递归 #分治 #BST #tree