Leetcode 96. Unique Binary Search Trees

題目
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組成的二叉搜索樹。
先給出網上的定義:
BST(Binary Search Tree),二叉查找樹;

性質:
若結點的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值;
若結點的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值;
該結點的左、右子樹也分別為二叉查找樹;

遍歷:
對于一個已知的二叉查找樹,從小到大輸出其節點的值;
只需對其進行二叉樹的中序遍歷即可;
即遞歸地先輸出其左子樹,再輸出其本身,然后輸出其右子樹;
遍歷的時間復雜度為O(n);

查找:
對于一個已知的二叉查找樹x;
在其中查找特定的值k,函數Search返回指向值為k的節點指針;
若找不到則返回0,算法時間復雜度為O(h),h為樹的高度;
理想情況下時間復雜度為lgn;

最大值和最小值:
要查找二叉查找樹中具有最小值的元素;
只要從根節點開始,沿著左子樹找到最左邊的節點就可以了;
反之沿著右子樹查找則可以求最大值;

插入:
從根節點開始插入;
如果要插入的值小于等于當前節點的值,在當前節點的左子樹中插入;
如果要插入的值大于當前節點的值,在當前節點的右子樹中插入;
如果當前節點為空節點,在此建立新的節點,該節點的值為要插入的值,左右子樹為空,插入成功;

刪除:
如果該沒有子女,直接刪除;
如果該結點只有一個子女,則刪除它,將其子女的父親改為它的父親;
如果該結點有兩個子女,先用其后繼替換該節點,其后繼的數據一并加在其后;

可以思考一定數目的二叉搜索樹數目是固定的,因此任選一個數當根節點,那么小于該數的數都會在其左子樹,而大于該數的都會在其右子樹。該種情況的數目就為左子樹的數目和右子樹數目的乘積。
即為動態規劃的思想。

int a[100000];
int numTrees(int n) {
    a[0]=1;
    a[1]=1;
    a[2]=2;
    for(int i=3;i<=n;i++)
    {
        int ans=0;
        for(int j=1;j<=i;j++)
        {
            ans+=a[j-1]*a[i-j];
        }
        a[i]=ans;
    }
    return a[n];
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容