Unique Binary Search Trees II (LeetCode)

Question:

https://oj.leetcode.com/problems/unique-binary-search-trees-ii/

 

解答:

一般来说列举所有的可以用recursive还有bst,但是这儿bst不好用。recursive就简单些,对于当前node,求得它左子树的所有组合(vector<TreeNode*> leftChilds),还有它右子树的所有组合(vector<TreeNode*> rightChilds),两边合在一起就是当前node所有BST的组合。注意子树有可能空的情况。

 

/**
 * 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<TreeNode*> ret;

        GenerateBst(ret, 1, n);
        
        return ret;
    }
    
    void GenerateBst(vector<TreeNode*>& ret, int start, int end)
    {
        if (start > end)
        {
            ret.push_back(NULL); // make sure it at least has one node
            return;
        }

        for (int i = start; i <= end; i++)
        {
            vector<TreeNode*> leftChilds;
            vector<TreeNode*> rightChilds;
                
            GenerateBst(leftChilds, start, i-1);
            GenerateBst(rightChilds, i+1, end);
                
            for (int j = 0; j < leftChilds.size(); j++)
            {
                for (int k = 0; k < rightChilds.size(); k++)
                {
                    TreeNode* node = new TreeNode(i);
                    node->left = leftChilds[j];
                    node->right = rightChilds[k];
                        
                    ret.push_back(node);
                }
            }
        }
    }    
};

 

posted @ 2014-10-12 07:08  smileheart  阅读(121)  评论(0)    收藏  举报