zoukankan      html  css  js  c++  java
  • 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;
        }
    };
      
  • 相关阅读:
    分享15个Linux 实用技巧,提高工作效率
    隐藏搜索框:CSS 动画正反向序列
    js检测开发者工具是否打开,防止别人恶意调试我们的代码
    Js实现元素右滑回弹效果(基于Uniapp)
    css ::marker伪元素,修改li的项目符号颜色,字号字体
    Jump Game II
    Google 面经 09/26
    Word Search
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5618580.html
Copyright © 2011-2022 走看看