題目
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];
}