LeetCode 95: Unique Binary Search Trees II

来源:互联网 发布:如何精通三坐标编程 编辑:程序博客网 时间:2024/05/18 06:37

Unique Binary Search Trees II

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.
图片

解题思路

和 Unique Binary Search Trees 相比,本题要求返回所有的 structurally unique BST 而不是 structurally unique BST 的数目。 因此,动态规划在这里不太适用。

这里依然使用递归求解。每次选取一个结点为根,然后递归求解左右子树的所有结果,最后根据返回的所有左右子树,依次选取然后接到当前结点上(每个左子树依次和每一个右子树组合,总共有左右子树数量的乘积种情况),构造好之后作为当前树的结果返回。

代码入下:

/** * 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 {private:    vector<TreeNode*> internalGenerateTrees(int start, int end) {        vector<TreeNode *> result;        if (start > end) {            // 空树            result.push_back(NULL);        }        else {            for (int i = start; i <= end; ++i) {                // 递归求解左子树                vector<TreeNode*> lefts = internalGenerateTrees(start, i - 1);                // 递归求解右子树                vector<TreeNode*> rights = internalGenerateTrees(i + 1, end);                for (int m = 0; m < lefts.size(); ++m) {                    for (int n = 0; n < rights.size(); ++n) {                        // 每个左子树依次和每一个右子树组合                        TreeNode *root = new TreeNode(i);                        root->left = lefts[m];                        root->right = rights[n];                        result.push_back(root);                    }                }            }        }        return result;    }public:    vector<TreeNode*> generateTrees(int n) {        return internalGenerateTrees(1, n);    }};
0 0
原创粉丝点击