中序遍历对BST很是重要,以前也讲过了BST的基本操做。(东哥总结的是真的强)算法
给定一个正整数n,请你计算,存储{1,2,3...n}这些值共有多少种不一样的BST结构。
仍是那句老话,二叉树算法的关键在于明确根节点须要作什么。
假设给算法输入5,也就是说用{1,2,3,4,5}这些数字去构造BST。
首先,这棵BST的根节点总共有几种状况?
显然有5中,由于1-5均可以做为BST的根节点对吧。而后咱们固定住一个根节点,而后再进行分析,这个时候有几种不一样的BST呢?
好比树把3固定住,去分析其余树节点均可能的状况。
根据BST的性质,根节点的左子树都比根节点的值小,右子树的值都比根节点的值大。因此若是固定3为根节点,左子树节点就是{1,2}的组合,右子树就是{4,5}的组合。
左子树的组合数和右子树的组合数乘积就是3为根时的BST个数。
上面讲的是以3为根的状况,其余节点也是同样的。
[1,2]和[4,5]有几种组合呢?
排列组合公式 2*2=4种,也就是说咱们的结果就是左右子树组合的乘积。
使用递归函数函数
//闭区间[lo,hi]的数字能组成count(lo,hi)种BST int count(int lo,int hi);
根据这个函数的定义,结合刚才的分析,能够写出代码spa
//主函数 int numTrees(int n){ //计算闭区间[1,n]组成的BST的个数 return count(1,n); } //计算闭区间[lo,hi]组成的BST个数 int count(int lo,int hi){ //base case if(lo>hi){ return 1; } int res=0; for(int i=lo;i<=hi;i++){ //i的值做为根节点root int left=count(lo,i-1); int right=count(i+1,hi); //左右子树的组合数乘积是BST的总数 res+=left*right; } }