zoukankan      html  css  js  c++  java
  • LeetCode: Unique Binary Search Trees

    LeetCode: Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

    For example,
    Given n = 3, there are a total of 5 unique BST's.

       1         3     3      2      1
               /     /      /       
         3     2     1      1   3      2
        /     /                        
       2     1         2                 3
    
    地址:https://oj.leetcode.com/problems/unique-binary-search-trees/
    算法:动态规划,dp[i]记录有i个节点的搜索树数量,则$dp[i+1]=sum_{j=0}^{i-1}dp[j]*dp[i-1-j]$,代码:
     1 class Solution {
     2 public:
     3     int numTrees(int n) {
     4         vector<int> dp(n+1);
     5         dp[0] = 1;
     6         dp[1] = 1;
     7         for(int i = 2; i <= n; ++i){
     8             int sum = 0;
     9             for(int j = i-1; j >= 0; --j){
    10                 sum += (dp[j] * dp[i-1-j]);
    11             }
    12             dp[i] = sum;
    13         }
    14         return dp[n];
    15     }
    16 };

    第二题:

    Given 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
    
    地址:https://oj.leetcode.com/problems/unique-binary-search-trees-ii/
    算法:与上一题不同,本题要求构造出所有的解。用递归完成的,代码:
     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     vector<TreeNode *> generateTrees(int n) {
    13         TreeNode *p = NULL;
    14         if(n <= 0)  return vector<TreeNode*>(1,p);
    15         return generateSubtrees(1,n);
    16     }
    17     vector<TreeNode *> generateSubtrees(int s, int e){
    18         TreeNode *p = NULL;
    19         if(s > e)   return vector<TreeNode*>(1,p);
    20         if(s == e) {
    21             p = new TreeNode(s);
    22             return vector<TreeNode*>(1,p);
    23         }
    24         vector<TreeNode*> result;
    25         for(int i = s; i <= e; ++i){
    26             vector<TreeNode*> left = generateSubtrees(s,i-1);
    27             vector<TreeNode*> right = generateSubtrees(i+1,e);
    28             for(int left_i = 0; left_i < left.size(); ++left_i)
    29                 for(int right_i = 0; right_i < right.size(); ++right_i){
    30                     p = new TreeNode(i);
    31                     p->left = left[left_i];
    32                     p->right = right[right_i];
    33                     result.push_back(p);
    34                 }
    35         }
    36         return result;
    37     }
    38 };


  • 相关阅读:
    USB 之传输编码格式 NRZI 介绍
    ubuntu 14.04 安装中文输入法
    uart 超声波传感器数据读取
    Embarcadero Delphi 7 Lite 7.0.4.453 中文版
    Delphi连接Oracle控件ODAC的安装及使用
    ODAC 安裝 (11.2.4)
    Sql中CHARINDEX用法
    DELPHI 数据库控件心得
    delphi uniDac
    Delphi连接Oracle控件ODAC的安装及使用
  • 原文地址:https://www.cnblogs.com/boostable/p/leetcode_unique_binary_search_trees.html
Copyright © 2011-2022 走看看