LeetCode 95题不同的二叉搜索树||(C语言实现)
题目链接: https://leetcode-cn.com/problems/unique-binary-search-trees-ii/
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
1 2 3 4 5 |
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 |
---|
这道题属于一个树的动态规划问题,首先我们可以找到其最优子结构就是从1到n的每个点为顶点其余点为子树(比定点小放在左子树,比顶点大放在右子树)的所有二叉树的集合。其边界就是当根节点的子树为空时的情况,如果想外扩展一下,当根节点的子树为1时,可以直接确定该根节点的左右子树为空,这样可以减少一些循环。因为根节点不同则树不同,所以这一规划问题无重复字。
找到了最优子结构与边界,下一步就是寻找其关系方程式,不难相出以下关系方程:
当start < end时,返回空(二级指针指向的一级指针指向NULL)
其他情况可分为等或不等(来减少一些循环数):
当start == end 时,返回一颗值为start的数;
当start > end 时,递归调用此函数构造以从start到end为顶点的树。
那么这道题就解决了。。。
具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode** create(int start,int end,int*m)
// 返回所有从start开始到end结束这些数所能构成的二叉搜索树,并通过间接赋值输出这些二叉树的数目
{
struct TreeNode **p,**lefts,**rights;
int a,i,b,j,k,count = 0; //定义的变量