【一天一道LeetCode】#95. Unique Binary Search Trees II

来源:互联网 发布:触摸屏手写软件 编辑:程序博客网 时间:2024/06/05 17:06

一天一道LeetCode

本系列文章已全部上传至我的github,地址:ZeeCoder‘s Github
欢迎大家关注我的新浪微博,我的新浪微博
欢迎转载,转载请注明出处

(一)题目

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.

这里写图片描述

(二)解题

刷了这么久的题,做题起来还是这么吃力,好心塞。
今天这道题想了好久,写完代码发现思路都错了。
明天继续想!


——————————————–20160619 updata———————————————
题目大意:给定一个数n,求以1~n组成的所有二叉搜索树。
二叉搜索树的特征是:左子树<根节点<右子树
由这个特征可以得出解题的大致思路:
首先从1~n中选取一个数i,将小于i的数放在一个集合left中,将大于i的放在另一个集合right中,再从left和right中各选取一个数作为i的左右子树,剩下的就是递归的过程了。
left集合和right集合中也是进行上述同样的操作,选取一个i,大于和小于i的分别选一个数作为左右子树,得到一个小二叉搜索树。
最后就可以得到所有的二叉搜索树的集合了。

/** * 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) {        vector<TreeNode*> ret;        if(n==0) return ret;//n=0,特殊情况        ret = createTree(1,n);        return ret;    }    vector<TreeNode*> createTree(int start ,int end)    {        vector<TreeNode*> results;        if(start > end)//代表没有选取的节点了        {            results.push_back(NULL);            return results;        }        for(int i = start ; i <= end ; i++)        {            vector<TreeNode*> left = createTree(start,i-1);//左边的子树集合            vector<TreeNode*> right = createTree(i+1,end);//右边的子树集合            for(int m = 0 ; m < left.size() ; m++)            {                for(int n = 0 ; n < right.size() ; n++)                {                    TreeNode* root = new TreeNode(i);                    root ->left = left[m];//从小于i的数中选取一个作为左子树                    root ->right = right[n];//从大于i的数中选取一个作为右子树                    results.push_back(root);                }            }        }        return results;//返回以i为root节点的子二叉搜索树    }};
0 0
原创粉丝点击