Unique Binary Search Trees

来源:互联网 发布:安卓网络诊断修复工具 编辑:程序博客网 时间:2024/06/09 14:50

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

思路:从1-n 每一个数都可以作为根节点,当i作为根节点的时候,从1-(i-1)可以作为左子树,从i+1到n可以作为右子树,那么左子树的棵数乘以右子树的棵树就是当前i结点都作为根节点的所有可能的BST树的棵树。
用h[i]来表示共有i个结点时,能构成的BST树的数目。

  1. 当n=0为空树只有一种情况,所以h[0]=1;
  2. 当n=1,只有一个结点,所以h[1]=1

h(n)=h(0)*h(n-1)+h(1)*h(n-2)+h(2)*h(n-3)+…+h(n-1)*h(0)
实际上就是卡特兰公式,这个公式与从1-n每一个数都可以作为根节点是一一对应的,比如n=4;

  1. 当i=1时,确定左边0个结点,右边有n-1个结点
  2. 当i=3时,可以确定左边2个结点,右边有1个结点
public class Solution {    public int numTrees(int n) {       if(n<0) return 0;       int[] h=new int[n+1];        h[0]=1;       h[1]=1;       for(int i=2;i<=n;i++)       {           for(int j=0;j<i;j++)             h[i]+=h[j]*h[i-1-j];             }        return h[n];    }  }

递归如下(但是超时了):

public  int numTrees(int n) {        int result = 0;        if (n <= 0)            return 0;        result = constructTree(1, n);        return result;    }     int constructTree(int start, int end) {        if (end - start <= 0)            return 1;        if (end - start == 1)            return 2;        int result = 0;        for (int i = start; i <= end; i++) {            result = result + constructTree(start, i - 1)                    * constructTree(i + 1, end);        }        return result;
0 0