zoukankan      html  css  js  c++  java
  • LeetCode 95. 不同的二叉搜索树 II

    题意:给出n,求出1~n所构造的BST集合。   (由于返回值是vector<TreeNode*>,我刚开始还没看懂这是什么意思.....)

    解题思路:

    • 对于一棵BST,很显然,其左右子树都是BST。
    • 因为要构造所有BST,因此每个结点都可能是根结点。
    • 那么建立一个函数BuildTree(int left,int right),   建立包括[left,right)的所有BST,在函数内,需要for来选取每个结点作为根结点。
    • 接下来就是容易出问题的地方。   刚开始我是这样定义:   TreeNode* BuildTree(int left,int right);      然后在内部,  root->left=BuildTree(left,i);   root->right=BuildTree(i+1,right);   结果在运行的时候发现怎么少了一些树。      问题根源:在这样的BuildTree中,对于每个root,只会返回一棵子树。(即使你循环了n次,只在最后一次进行返回,因此只返回一棵子树)。
    • 纠正:vector<TreeNode*> BuildTree(int left,int right),返回包含[left,right)的所有BST!!!     

    另外,LeetCode还是能够cout进行调试,系统会在下面显示标准输出!!!(下次关于LeetCode的调试还是做一篇总结,不会调试还是挺麻烦的。)

     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*> BuildTree(int left,int right){
    13         vector<TreeNode*> v;
    14         // 必须加上,否则会v.size()=0;
    15         if(left>=right){
    16             v.push_back(NULL);
    17         }
    18         else{
    19             TreeNode* head;
    20             for(int i=left;i<right;i++){
    21                 // 左右BST子树的根结点;
    22                 vector<TreeNode*> v1=BuildTree(left,i);
    23                 vector<TreeNode*> v2=BuildTree(i+1,right);
    24                 // 双重循环建立BST
    25                 for(int j=0;j<v1.size();j++){
    26                     for(int k=0;k<v2.size();k++){
    27                         head=new TreeNode(i);
    28                         head->left=v1[j];
    29                         head->right=v2[k];
    30                         v.push_back(head);        
    31                     }
    32                 }
    33             }
    34         }
    35         
    36 //        cout<<v.size()<<endl;   //  调试    
    37         return v;
    38     }
    39     
    40     vector<TreeNode*> generateTrees(int n) {
    41         TreeNode* head;
    42         vector<TreeNode*> v;
    43         // 如果n==0,那么是没有元素的,根据我的写法,会产生[null]。 
    44         if(n==0){
    45             return v;
    46         }
    47         v=BuildTree(1,n+1);
    48         return v;
    49     }
    50 };                                    
  • 相关阅读:
    tensorflow入门(三)
    tensorflow入门(二)
    setTimeout
    PreResultListener
    sql 删除重复记录
    oracle dual表用途及结构详解
    oracle中的dual表
    Dubbo远程调用服务框架原理与示例
    struts2和spring的两种整合方式
    Timer和TimerTask详解
  • 原文地址:https://www.cnblogs.com/yy-1046741080/p/11594454.html
Copyright © 2011-2022 走看看