95. Unique Binary Search Trees II

来源:互联网 发布:淘宝网的电商模式 编辑:程序博客网 时间:2024/06/15 12:54

题目:唯一的二叉搜索树2

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

题意:

给定一个整数n,生成所有结构的唯一二叉搜索树来存储1到n之间的所有数。OJ里面存储二叉树是按照一层一层遍历的,如果在一层中有不存在的节点,则用‘#’字符表示。例如

   1  / \ 2   3    /   4    \     5
在OJ中存储序列为“{1,2,3,#,#,4,#,#,5}”


思路:

该题是Unique Binary Search Trees题目的延伸,Unique Binary Search Trees题只需要返回有多少中存储方法即可,这道题需要将每种结构的二叉树结构建出来按OJ的存储序列存储之后返回。构建二叉树的问题一般都是采用递归来解,划分左右子树,递归构造。

代码:C++版:28ms

/** * Definition for a binary tree node. * 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) {        if (n == 0) return {};        return generate(1, n);    }private:    vector<TreeNode*> generate(int start, int end) {        vector<TreeNode*> subTree;  //存储各种结构的二叉搜索树        if (start > end) {            subTree.push_back(nullptr);            return subTree;        }        for (int k=start; k<=end; k++) {            vector<TreeNode*> leftSubs = generate(start, k-1);  //左子树集合            vector<TreeNode*> rightSubs = generate(k+1, end);  //右子树集合            for (auto i : leftSubs) {                for (auto j : rightSubs) {                    TreeNode *node = new TreeNode(k);  //新建根节点,将左右子节点拼接到根节点的左右子树                    node->left = i;                    node->right = j;                    subTree.push_back(node); //将每种不同结构的二叉搜索树保存进vector中                }            }        }        return subTree;    }};

0 0
原创粉丝点击