Given n,
how many structurally unique BST‘s (binary
search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST‘s.
1 3 3 2 1 \ / / / \ 3 2 1 1 3 2 / / \ 2 1 2 3
给定一个n值,那么从1.2.3....N共N个数,能构建几棵二叉排序树。
解题思路就是:遍历1至N个数,求它们每个元素作为根节点的情况,根据中序遍历的思想,小于根节点的排在左边,大于根节点的排在右边。求出左边子二叉树的构建数目和右二叉树的构建数目,相乘就得到该二叉树的数目了。该题是不是感觉又可以根据递归的思路来解了。
递归思路:
public int numTrees(int n) { if(n==0||n==1)return 1; if(n==2)return 2; int num=0; for(int i=1;i<=n;i++)//根节点 { num+=numTrees(i-1)*numTrees(n-i);//左子树二叉排序树的构建数目*右子树二叉排序树的构建数目 } return num; }
虽然逻辑是对的,但是leetcode提示timeLimited。也就是递归超时了。
那我们试一试将已经作为根节点求解的构建数目先用数组保存起来,然后后面的节点求解的时候再调用。
1)先定义一个array
2)array[0]表示节点数为0的情况,array[0]=1;
3)array[1]表示1个节点的求解只有一种情况:左节点的个数和右节点个数都为0即a[0]*a[0];
4)array[2]表示2个节点的求解只有两种情况:左节点的个数和右节点个数都为a[1]*a[0],a[0]*a[1]
5)array[3]表示3个节点的求解只有三种情况:左节点的个数和右节点个数为a[2]*a[0],a[1]*a[1],a[0]*a[2]
以此类推
我们用代码实现如下
public int numTrees(int n) { int[] array=new int[n+1]; array[0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<i;j++) { array[i]+=array[j]*array[i-j-1]; } } return array[n]; }
时间: 2024-10-17 06:15:46