1. 程式人生 > >ACM之不同的二叉搜索樹

ACM之不同的二叉搜索樹

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之不同的二叉搜索樹