• 95. Unique Binary Search Trees II


    Problem:

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.

    Example:

    Input: 3
    Output:
    [
      [1,null,3,2],
      [3,2,null,1],
      [3,1,null,null,2],
      [2,1,3],
      [1,null,2,null,3]
    ]
    Explanation:
    The above output corresponds to the 5 unique BST's shown below:
    
       1         3     3      2      1
               /     /      /       
         3     2     1      1   3      2
        /     /                        
       2     1         2                 3
    

    思路

    同样采用递归的思想。若节点(i)作为根节点,则只需分别构造(1, cdots, i-1)的左子树和(i+1, cdots, n)的右子树。同样的,左右子树的构造也是一个递归的过程。

    注意:vector<TreeNode*>数组中储存的是根节点的值,所以要将根和左子树及右子树连起来时,只需分别将存储左右子树的vector<TreeNode*>left, right中的元素遍历一遍,作为根的左右子节点即构造完毕。

    Solution (C++):

    public:
        vector<TreeNode*> generateTrees(int n) {
            if (n == 0)  return vector<TreeNode*> {};
            return genTrees(1, n);
        }
    private:
        vector<TreeNode*> genTrees(int start, int end) {
            vector<TreeNode*> bst;
            vector<TreeNode*> left, right;
            
            if (start > end)  {
                bst.push_back(NULL);
                return bst;
            }
            if (start == end) {
                TreeNode* s = new TreeNode(start);
                bst.push_back(s);
                return bst;
            }
            
            for (int i = start; i <= end; ++i) {    //以i为根
                left = genTrees(start, i-1);
                right = genTrees(i+1, end);
                for (auto lnode: left) {
                    for (auto rnode: right) {
                        TreeNode* root = new TreeNode(i);
                        root->left = lnode;
                        root->right = rnode;
                        bst.push_back(root);
                    }
                }
            }
            return bst;
        }
    

    性能

    Runtime: 20 ms  Memory Usage: 19.1 MB

    相关链接如下:

    知乎:littledy

    欢迎关注个人微信公众号:小邓杂谈,扫描下方二维码即可

    作者:littledy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    大学阶段最后的交流
    JavaScript的一些基础性知识
    CSS的一些总结
    JavaWeb的一些理解
    Java Web之XML基础
    Java基础增强
    反射的理解
    Java网络编程
    Java 中剩下的流以及线程方面的知识
    Java中的流操作
  • 原文地址:https://www.cnblogs.com/dysjtu1995/p/12320566.html
Copyright © 2020-2023  润新知