zoukankan      html  css  js  c++  java
  • leetcode--95. Unique Binary Search Trees II

    1、原题描述

    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

    2、思路:II与I是一样的题目只是返回结果不同,I只需要返回可以生成的BST的数目,II要求返回所有Tree。II的难点在于怎么返回这个结果。基本代码思路还是I,[st, i - 1]和[i+1, end]

       返回以此为范围生成的所有tree,然后两者合并,当然合并时需要把每棵树都要copy一份。

    3、代码实现

     1 /**
     2  * Definition for a binary tree node.
     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         return generate_bst(1, n);
    14     }
    15     
    16     vector<TreeNode*> generate_bst(int st, int end) {
    17         vector<TreeNode*> results;
    18         for (int i = st; i <= end; i++) {
    19             vector<TreeNode*> res_left = generate_bst(st, i - 1);
    20             vector<TreeNode*> res_right = generate_bst(i + 1, end);
    21             save_results(results, i, res_left, res_right);
    22         }
    23         return results;
    24     }
    25     
    26     void save_results(vector<TreeNode*>& results, const int root_val, 
    27                       const vector<TreeNode*>& res_left, const vector<TreeNode*>& res_right) {
    28         int num_left = res_left.size();
    29         int num_right = res_right.size();
    30         if (num_left == 0 && num_right == 0) {
    31             TreeNode* root = new TreeNode(root_val);
    32             return results.push_back(root);
    33         } else if (num_left == 0) {
    34             for (int i = 0; i < num_right; i++) {
    35                 TreeNode* root = new TreeNode(root_val);
    36                 root->right = copy_tree(res_right[i]);
    37                 results.push_back(root);
    38             }
    39         } else if (num_right == 0) {
    40             for (int i = 0; i < num_left; i++) {
    41                 TreeNode* root = new TreeNode(root_val);
    42                 root->left = copy_tree(res_left[i]);
    43                 results.push_back(root);
    44             }
    45         } else {
    46             for (int i = 0; i < num_left; i++) {
    47                 for (int j = 0; j < num_right; j++) {
    48                     TreeNode* root = new TreeNode(root_val);
    49                     root->left = copy_tree(res_left[i]);
    50                     root->right = copy_tree(res_right[j]);
    51                     results.push_back(root);
    52                 }
    53             }
    54         }
    55         return;
    56     }
    57     
    58     TreeNode* copy_tree(TreeNode* root) {
    59         if (root == NULL) {
    60             return NULL;
    61         }
    62         
    63         TreeNode* node = new TreeNode(root->val);
    64         node->left = copy_tree(root->left);
    65         node->right = copy_tree(root->right);
    66         return node;
    67     }
    68 };
    View Code

    4、优化

       应该是没有优化空间了,返回结果决定了解空间,后续看看在一些小操作上面有没有优化空间。

    5、api

    verctor: push_back只能在最后追加(添加)一个元素。似乎没有方法能一次添加多个元素,除了初始化时。

  • 相关阅读:
    C盘扩容 无损分区 (摘录自百度经验)
    Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据
    手机访问PC站时自动跳转到手机站
    C# String 前面不足位数补零的方法
    把页面翻译成繁体
    网页上传视频.MP4视频编码、音频编码配置
    同样的mp4文件,本地测试可以播放,浏览服务器页面时不能播放
    vue $refs给for循环出来的某一个添加样式
    vue 获取验证码倒计时
    判断两个数组的内容是否相同
  • 原文地址:https://www.cnblogs.com/shihuvini/p/7887506.html
Copyright © 2011-2022 走看看