LeetCode: 95. Unique Binary Search Trees II

95. Unique Binary Search Trees II

  • 题目

    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
      
  • 题解
    • 本题的题意比较简单,给出二叉搜索树的节点数目n,求出可以构成多少中不同结构的二叉搜索树。
    • 其实实现起来还是比较简单的。对于其中一个节点i,将其作为该树的根节点,然后其左边的元素都作为其左子树的元素,右边的元素都作为其右子树的元素,再通过递归得到其左子树和右子树的可能出现的情况的集合,然后再组合起来。一些需要注意的情况:
      • 递归的结束条件: 当该子树的起点大于终点的时候 – start > end,递归结束,能够生成子树的情况为无,即为NULL
      • 对得到的左子树和右子树的返回情况需要判断其是否为空(可能没有不存在左或右节点的情况),如果不存在,需要推入一个NULL,然后再进行组合,否则遍历组合的时候left.size * right.size = 0,将导致结果不全,只有左右子树都存在的结果。
  • 实现代码
    /**
     * 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) 
        		return vector<TreeNode*>();
        	
        	vector<TreeNode*> v = myGenerate(1, n);
            return v;
        }
    
    	 vector<TreeNode*> myGenerate(int start, int end) {
    	 	vector<TreeNode*> v;
    	 	if(start > end)	return v;
    	
    	 	for(int i = start; i <= end; ++i) {
     			vector<TreeNode*> left = myGenerate(start, i-1);
    	 		vector<TreeNode*> right = myGenerate(i + 1, end);
    	
    			if(!left.size())	left.push_back(NULL);
    			if(!right.size())	right.push_back(NULL);
    	
    			for(int j = 0; j < left.size(); ++j) {				
    				for(int k = 0; k < right.size(); ++k) {
    					TreeNode* node = new TreeNode(i);
    					node->left = left[j];
    					node->right = right[k];
    					v.push_back(node);
    				}
    			}
    	 	}
    	     return v;	
    	 }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值