写出最少生成节点 高度为H的AVL树

根据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(n1)+f(n2)+1f(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值