Fibonacci二叉树的形成
1.以数据个数N来决定Fibonacci为K阶(k-order)
j=0 Fib(0)=0
j=1 Fib(1)=1
j=2 Fib(2)=1
j=3 Fib(3)=2
j=4 Fib(4)=3
……
j=N Fib(N)= Fib(N-1)+Fib(N-2)
设计一最小的k值,使得Fib(k+1)>N+1
2.K=0或k=1则表示Fibonacci只有一个结点,其余别无它物。
3.k>=2,则表示Fibonacci的根为Fib(k),左子树为(k-1)阶Fibonacci树(其根为Fib(k-1),右子树为(k-2)阶Fibonacci树(其根为Fib(k)+Fib(k-2)),上面的算法适用于N+1值为Fibonacci树,若N+1不为Fibonacci树,则找出M使得Fib(k)<N+1,再依上述算法建立Fibonacci树,最后把Fibonacci树的各结点数据减去M,就可以了。
Fibonacci差值原则
(1)左子树为负,右子树为正。
(2)如图所示:
步骤:
假设数据个数有n个且n比某一Fibonacci数小,满足下列的运算式,如下所示:
Fa>=n+1
则Fa-1就是这棵Fibonacci树的树根,而Fa-3则是开始的差值。如果我们要查找一个值key。首先我们比较数组索引和key,而得到下列的三种情况,如下所示:
1. 当key比较小,则我们查找1到Fa-1-1的数据。
2. 当key比较大,则我们查找Fa-1+1到Fa-1的数据。
3. 当key与数组索引Fa-1的值相等,表示查找成功。
4. 继续上述的步骤直到找到键值或Fibonacci树的差值为零。
fib[]={0,1,1,2,3,5,8,13,21,34,……}
int fib_search(int n,i