ACM之不同的二叉搜索樹
阿新 • • 發佈:2018-04-30
ACM 搜索二叉樹 題目如下:
首先得知道什麽是二叉搜索樹:二叉搜索樹又叫做有序二叉樹、排序二叉樹,是指一顆空樹或者具有下列性質的樹:
①若任意節點的左子樹不為空,則左子樹上所有結點的值均小於它根節點的值
②若任意節點的右子樹不為空,則右子樹上所有結點的值均大於它根節點的值
③任意結點的左、右子樹也是二叉搜索樹
④所有結點的值均不相同
假設n個結點上的值由1,2,...,n構成,則搜索二叉樹按照中序遍歷輸出的結果是就是1、2、...、n。
設num(a)表示有a個結點時搜索二叉樹有多少種可能,則
Ⅰ.當頭結點的值為1時,左子樹為空,右子樹上有a - 1個結點,右子樹的搜索二叉樹個數為num(a - 1)
Ⅱ.當頭結點的值為i(1 < i < n)時,左子樹由結點1—i-1構成,右子樹由結點i+1—n構成;左子樹的搜索二叉樹個數為num(i-1),右子樹的搜索二叉樹個數為num(n - i);此時搜索二叉樹總的個數為num(i - 1) * num(n - i)
Ⅲ.當頭結點的值為a時,右子樹為空,左子樹上有a - 1個結點,左子樹的搜索二叉樹個數為num(a - 1)
所以,a個結點時搜索二叉樹的個數上述三個步驟的和。
從步驟Ⅱ可以看出來,這種算式與斐波拉契數列非常相似,那就直接用動態規劃計算,時間復雜度為O(n^2)
Java實現
package Leetcode; /* *@author: David *@Time: 2018年4月27日下午9:10:38 *@Description: *Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? */ public class BST_num { //TIME : O(n^2) private static int Solution(int n) { if (n < 2) return 1; int[] num = new int[n+1]; num[0] = 1; for(int i = 1;i < n + 1;i++){ for(int j = 1;j < i+1 ;j++){ num[i] += num[j - 1] * num[i - j]; } } return num[n]; } public static void main(String[] args){ int n = 3; System.out.println(Solution(n)); } }
ACM之不同的二叉搜索樹