Unique Binary Search Trees

来源:互联网 发布:淘宝双收藏是什么意思 编辑:程序博客网 时间:2024/06/15 08:34

题目

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

思路

二叉搜索树有一个性质:根节点左边的都比它要小,跟节点右边的都比它要大。从处理子问题的角度来看,选取一个结点为根,就把结点切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,所以总的数量是将以所有结点为根的可行结果累加起来。

count[i]代表节点数为i的唯一子树有多少个.注意题目中的要求;节点值为1....n。所以如果根为k,则根左边的数是1到k-1,根右边的数是k+1到ni=0, count[0]=1 //空树i=1, count[1]=1 //只有一个节点i=2, count[2]=count[0]*count[1] // 1 为根            + count[1]*count[0] // 2 为根i=3, count[3]=count[0]*count[2] // 1 为根            + count[1]*count[1] // 2 为根            + count[2]*count[0] // 3 为根i=4, count[4]=count[0]*count[3] // 1 为根            + count[1]*count[2] // 2 为根            + count[2]*count[1] // 3 为根            + count[3]*count[0] // 4 为根......i=n, count[i] = count[0]*count[i-1]               +count[1]*count[i-2]                  ...                +count[i-1]*count[0]                =sum(count[0..k]*count[k+1...n]) 0 <= k < n-1

java实现

public int numTrees(int n) {        int[] count = new int[n + 1];        count[0] = 1;        count[1] = 1;        for (int i = 2; i <= n; i++) {            for (int j = 0; j <= i - 1; j++) {                count[i] += count[j] * count[i - j - 1];            }        }        return count[n];    }
原创粉丝点击