zoukankan      html  css  js  c++  java
  • 【leetcode】 Unique Binary Search Trees II (middle)☆

    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

    这次的题目要求是得到所有的树。

    我的思路:

    用f[n]存储1-n的所有方法的根节点

    则 f[n+1] = 1作为根,f[0]做左子树,f[n]所有节点都加1做右子树  +  2作为根,f[1]做左子树,f[n - 1]所有节点都加2做右子树 +...

    代码内存都没有释放,不过AC了。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <stack>
    using namespace std;
    
    
    // Definition for binary tree
     struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     };
    
    class Solution {
    public:
        vector<TreeNode *> generateTrees(int n) {
            vector<vector<TreeNode *>> ans(n + 1, vector<TreeNode *>());
            if(n == 0)
            {
                ans[0].push_back(NULL);
                return ans[0];
            }
            
            TreeNode * root = NULL;
            ans[0].push_back(root);
            root = new TreeNode(1);
            ans[1].push_back(root);
            for(int i = 2; i <= n; i++) //总数字
            {
                for(int j = 0; j < i; j++) //小于根节点的数字个数
                {
                    for(int l = 0; l < ans[j].size(); l++) //小于根节点的组成方法数
                    {
                        for(int r = 0; r < ans[i - j - 1].size(); r++) //大于根节点的组成方法数
                        {
                            TreeNode * root = new TreeNode(j + 1);
                            root->left = ans[j][l]; 
                            root->right = add(ans[i - j - 1][r], j + 1); //大于根节点的需要加上差值
                            ans[i].push_back(root);
                        }
                    }
                }
            }
    
            return ans[n];
        }
    
        TreeNode * add(TreeNode * root, int Num)
        {
            if(root == NULL)
            {
                return root;
            }
            TreeNode * T = new TreeNode(root->val + Num);
            T->left = add(root->left, Num);
            T->right = add(root->right, Num);
    
            return T;
        }
    };
    
    int main()
    {
        Solution s;
        vector<TreeNode *> ans = s.generateTrees(3);
    
        return 0;
    }

    看别人的思路,把建立子树分为从数字start-end,直接递归求解,不需要像我的那样每次还要把右子树遍历增加值

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<TreeNode*> generateTreesRec(int start, int end){
            vector<TreeNode*> v;
            if(start > end){
                v.push_back(NULL);
                return v;
            }
            for(int i = start; i <= end; ++i){
                vector<TreeNode*> left = generateTreesRec(start, i - 1);
                vector<TreeNode*> right = generateTreesRec(i + 1, end);
                TreeNode *node;
                for(int j = 0; j < left.size(); ++j){
                    for(int k = 0; k < right.size(); ++k){
                        node = new TreeNode(i);
                        node->left = left[j];
                        node->right = right[k];
                        v.push_back(node);
                    }
                }
            }
            return v;
        }
        vector<TreeNode *> generateTrees(int n) {
            return generateTreesRec(1, n);
        }
    };
    
    
  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/dplearning/p/4153307.html
Copyright © 2011-2022 走看看