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 };


  • 相关阅读:
    Zookeeper安装部署
    dubbo/dubbox部署资料收集
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    ios开发--清理缓存
    从零开始,让你的框架支持CocoaPods
    iOS 开发-- Runtime 1小时入门教程
    iOS 开发--github的demo
    linux 防火墙iptables简明教程
    利用BBRSACryptor实现iOS端的RSA加解密
    iOS开发--数组
  • 原文地址:https://www.cnblogs.com/boostable/p/leetcode_unique_binary_search_trees.html
Copyright © 2011-2022 走看看