根据AVL树规则
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
1
,
f
(
0
)
=
0
f(n)=f(n-1)+f(n-2)+1 , f(0)=0
f(n)=f(n−1)+f(n−2)+1,f(0)=0 ,
f
(
1
)
=
1
f(1)=1
f(1)=1 ,
f
(
2
)
=
2
f(2)=2
f(2)=2
代码如下
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
typedef struct AvlNode AvlNode;
typedef struct AvlNode* Position;
typedef struct AvlNode* AvlTree;
struct AvlNode {
int item;
AvlTree left;
AvlTree right;
int height;
};
static int RandInt(int i, int j)
{
int tmp;
tmp = (int)(i + (1.0 * rand() / RAND_MAX) * (j - i));
return tmp;
}
static AvlTree makeRandomAvlTree(int H)
{
if (H >= 0) // 递归调用
{
AvlTree T = (Position)malloc(sizeof(AvlNode));
if (T == NULL)
{
printf(" Out of space\n");
return NULL;
}
T->left = makeRandomAvlTree(H - 1); // 控制左右两边的节点数量
T->right = makeRandomAvlTree(H - 2);
if (T->left == NULL && T->right == NULL) // 如果是最后一个节点 则随机生成
T->item = rand();
else if (T->left == NULL) // 如果左子树为空的话 说明含有右子树 并且T.item 要小于右子树
T->item = RandInt(0, T->right->item);
else if (T->right == NULL)
T->item = RandInt(T->left->item, RAND_MAX); // 同理上面
else
T->item = RandInt(T->left->item, T->right->item); // 当两边节点都存在的时候 当前节点要处于左节点与右节点之中
return T;
}
return NULL;
}
static void preParse(AvlTree T)
{
if (T == NULL)
return;
printf(" %d\t", T->item);
preParse(T->left);
preParse(T->right);
}
static void inParse(AvlTree T)
{
if (T == NULL)
return;
inParse(T->left);
printf("%d\t", T->item);
inParse(T->right);
}
int main()
{
srand((unsigned)time(NULL));
AvlTree T = makeRandomAvlTree(6);
printf(" 前序\n");
preParse(T);
printf(" \n先序\n");
inParse(T);
printf(" \n");
}
代码运行结果 由规则推知
f
(
6
)
=
33
f(6)=33
f(6)=33
转载地址
https://blog.csdn.net/qq_33259057/article/details/105335787
https://blog.csdn.net/qq789045/article/details/51228457