95. Unique Binary Search Trees II

Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1
           /     /      /       
     3     2     1      1   3      2
    /     /                        
   2     1         2                 3
[1] [4] [5] [3] [2]

=====================BST树,平衡查找树

 如果将上图中的实例按照[1]..[5]的下标来摆放,

以1为根的树的个数,等于左子树的个数乘以右子树的个数,左子树是0个元素的树,右子树是2个元素的树.

以2为根的树的个数,等于左子树的个数乘以右子树的个数,左子树的元素个数为1,右子树元素个数为为1

...以此类推

========

当数组1,2,3...n时,基于一下原则构建BST树具有唯一性:以i为根节点的树,其左子树由[1,i-1]构成

其右子树由[i+1,n]构成.

定义f(i)为以int a[]=[1,i]能产生的Uniuqe BST的数目,

那么如果a[]为空,那么只有一种BST,即空树,f(0)=1

if a.size==1,单个节点,那么只有一种BST,f(1)=1

if a.size==2,有如下两种可能

 1         2

        /

   2    1

      f(2) = f(0)*f(1), 1为根的情况

     +f(1)*f(0), 2为根的情况

if a.size==3,那么

      f(3) = f(0)*f(2)//root=1

     +f(1)*f(1)//root=2

       +f(2)*f(0)//root=3

可以发现f的递归公式为

==========

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    ///
    vector<TreeNode*> generateTrees(int n){
        if(n==0) return generateTrees(1,0);
        return generateTrees(1,n);
    }

    vector<TreeNode*> generateTrees(int start,int end){
        vector<TreeNode*> subTree;
        if(start>end){
            subTree.push_back(nullptr);
            return subTree;
        }

        for(int k = start;k<=end;k++){
            vector<TreeNode*> leftSubs = generateTrees(start,k-1);
            vector<TreeNode*> rightSubs = generateTrees(k+1,end);
            for(auto i:leftSubs){
                for(auto j:rightSubs){
                    TreeNode *node = new TreeNode(k);
                    node->left = i;
                    node->right = j;
                    subTree.push_back(node);
                }
            }
        }
        return subTree;
    }
};
  
原文地址:https://www.cnblogs.com/li-daphne/p/5618580.html