• leetcode


    题目:Unique Binary Search Trees II

    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

    这道题是Unique Binary Search Trees I的后续,可以先看看http://www.cnblogs.com/laihaiteng/p/3789279.html这个,思路上有相似的地方

    个人思路:

    1、还是从1-n逐个遍历,作为BST的根节点,左半部分作为根节点的左子树,右半部分作为根节点的右子树

    2、递归函数返回从start到end的节点所能产生的不同的BST的集合,则把不同的左BST与右BST做一个乘积(或者说一一匹配),就是此时某个i(1-n中的某个数)作为根节点的BST的集合

    代码:

     1 #include <stddef.h>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 struct TreeNode
     7 {
     8     int val;
     9     TreeNode *left;
    10     TreeNode *right;
    11     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    12 };
    13 
    14 class Solution
    15 {
    16 public:
    17     vector<TreeNode *> generateTrees(int n)
    18     {
    19         vector<TreeNode *> result;
    20 
    21         if (n < 1)
    22         {
    23             TreeNode *root = NULL;
    24             result.push_back(root);
    25             return result;
    26         }
    27 
    28         result = generatePartTrees(1, n);
    29 
    30         return result;
    31     }
    32 private:
    33     vector<TreeNode *> generatePartTrees(int start, int end)
    34     {
    35         vector<TreeNode *> part;
    36 
    37         for (int i = start; i <= end; ++i)
    38         {
    39             vector<TreeNode *> leftTrees = generatePartTrees(start, i - 1);
    40             vector<TreeNode *> rightTrees = generatePartTrees(i + 1, end);
    41             //左右子树非空
    42             if (!leftTrees.empty() && !rightTrees.empty())
    43             {
    44                 for (int x = 0; x < leftTrees.size(); ++x)
    45                 {
    46                     for (int y = 0; y < rightTrees.size(); ++y)
    47                     {
    48                         TreeNode *root = new TreeNode(i);
    49                         TreeNode *left = leftTrees[x];
    50                         root->left = left;
    51                         TreeNode *right = rightTrees[y];
    52                         root->right = right;
    53                         part.push_back(root);
    54                     }
    55                 }
    56             }
    57             //左子树非空,右子树为空
    58             if (!leftTrees.empty() && rightTrees.empty())
    59             {
    60                 for (int x = 0; x < leftTrees.size(); ++x)
    61                 {
    62                     TreeNode *root = new TreeNode(i);
    63                     TreeNode *left = leftTrees[x];
    64                     root->left = left;
    65                     root->right = NULL;
    66                     part.push_back(root);
    67                 }
    68             }
    69             //左子树为空,右子树非空
    70             if (leftTrees.empty() && !rightTrees.empty())
    71             {
    72                 for (int y = 0; y < rightTrees.size(); ++y)
    73                 {
    74                     TreeNode *root = new TreeNode(i);
    75                     TreeNode *right = rightTrees[y];
    76                     root->left = NULL;
    77                     root->right = right;
    78                     part.push_back(root);
    79                 }
    80             }
    81             //左右子树均为空
    82             if (leftTrees.empty() && rightTrees.empty())
    83             {
    84                 TreeNode *root = new TreeNode(i);
    85                 root->left = NULL;
    86                 root->right = NULL;
    87                 part.push_back(root);
    88             }
    89         }
    90 
    91         return part;
    92     }
    93 };
    View Code

    网上看了一下,大致都是这个思路,但发现有更好的写法,链接:http://www.cnblogs.com/remlostime/archive/2012/11/19/2777841.html

    精简了一下代码:

     1 #include <stddef.h>
     2 #include <vector>
     3 
     4 using namespace std;
     5 
     6 struct TreeNode
     7 {
     8     int val;
     9     TreeNode *left;
    10     TreeNode *right;
    11     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    12 };
    13 
    14 class Solution
    15 {
    16 public:
    17     vector<TreeNode *> generateTrees(int n)
    18     {
    19         return generatePartTrees(1, n);
    20     }
    21 private:
    22     vector<TreeNode *> generatePartTrees(int start, int end)
    23     {
    24         vector<TreeNode *> part;
    25 
    26         if (start > end)
    27         {
    28             part.push_back(NULL);
    29             return part;
    30         }
    31 
    32         for (int i = start; i <= end; ++i)
    33         {
    34             vector<TreeNode *> leftTrees = generatePartTrees(start, i - 1);
    35             vector<TreeNode *> rightTrees = generatePartTrees(i + 1, end);
    36             for (int x = 0; x < leftTrees.size(); ++x)
    37             {
    38                 for (int y = 0; y < rightTrees.size(); ++y)
    39                 {
    40                     TreeNode *root = new TreeNode(i);
    41                     TreeNode *left = leftTrees[x];
    42                     root->left = left;
    43                     TreeNode *right = rightTrees[y];
    44                     root->right = right;
    45                     part.push_back(root);
    46                 }
    47             }
    48         }
    49 
    50         return part;
    51     }
    52 };
    View Code
  • 相关阅读:
    LaTex 章节层次
    计算机组成原理——第二章 运算方法和运算器(笔记)
    计算机组成原理——第一章 计算机组成原理概论(笔记)
    LaTex图片的插入与引用
    adobe 下载与安装
    Jupyter upload无效(无法上传文件)的解决办法
    小星星的js 找不到了 ,直接上源码
    excle网页上预览
    svn is already locked. 文件被锁定
    搭建SSM项目,从数据库到前台数据显示 2019
  • 原文地址:https://www.cnblogs.com/laihaiteng/p/3801607.html
Copyright © 2020-2023  润新知