95. 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.

1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \
2 1 2 3

confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.

OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies
a path terminator where no node exists below.

Here's an example:
1
/
2 3
/
4

5
The above binary tree is serialized as"{1,2,3,#,#,4,#,#,5}".

/**
 * 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;
        if(n < 1)
            return ret;
    	ret = generateTreesCore(1,n);
    	return ret;       
    }
//思考递归函数接口设计成什么,接口的设计应该以方便我们的
//操作为准则(由于本题是需要建立结点,所以需要知道具体的结点元素值)
//先构造一个框架,边写边思考边完善
                                      //l,r元素的范围
   vector<TreeNode *> generateTreesCore(int l,int r)
    {
    	vector<TreeNode*> ret;
    	if(l > r)
    	{
    		ret.push_back(nullptr);
    		return ret;
    	}
        //枚举根节点元素所有可能取值的情况
    	for(int i = l;i<=r;i++)
    	{   	
    		vector<TreeNode *> ret1 = generateTreesCore(l,i-1);
    		vector<TreeNode *> ret2 = generateTreesCore(i+1,r);
    		for(auto elem1:ret1)
    		{
    			for(auto elem2:ret2)
    			{
    				TreeNode * root = new TreeNode(i);
    				root->left = elem1;
    				root->right = elem2;
    				ret.push_back(root);
    			}
    		}
    	}
    	return ret;
    }
};

posted on 2021-06-13 10:13  朴素贝叶斯  阅读(18)  评论(0编辑  收藏  举报

导航