练习4.2 平衡二叉树的根 (25分) C语言实现

将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。

输入格式:

输入的第一行给出一个正整数N(≤20),随后一行给出N个不同的整数,其间以空格分隔。

输出格式:

在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。

输入样例1:

5
88 70 61 96 120

输出样例1:

70

输入样例2:

7
88 70 61 96 120 90 65

输出样例2:

88

本题重点在于平衡二叉树的调整。首先平衡二叉树是一种特殊的二叉排序树,即满足左结点的值小于根结点,右孩子的值大于根结点。所以进行插入所进行的调整都是为了能够满足二叉排序树的特点。
有四种情况RR,LL,RL,LR。其实LR就是先将二叉树以插入节点进行L旋转变成RR型;RL道理类似。
代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct TreeN* Tree;
 struct TreeN
{
	int data;
	Tree left;
	Tree right;
};
 
 int getheight(Tree s)
 {
	 int m =0, n = 0;
	 if (!s)
		 return 0;


		 m = getheight(s->left);
		 n = getheight(s->right);
		 if (m >= n)
			 return m + 1;
		 else
			 return n + 1;

 }

 Tree LL(Tree k1)
 {
	 Tree k2 = k1->left;
	 k1->left = k2->right;
	 k2->right = k1;
	 return k2;
 }
 Tree RR(Tree k1)
 {
	 Tree k2 = k1->right;
	 k1->right = k2->left;
	 k2->left = k1;
	 return k2;
 }

 Tree LR(Tree k3)
 {
	 k3->left = RR(k3->left);
	 return (LL(k3));
 }
 Tree RL(Tree k3)
 {
	 k3->right = LL(k3->right);
	 return (RR(k3));
 }

 Tree insert(Tree l, int data)
 {
	 if (l==NULL)
	 {
		  l = (Tree)malloc(sizeof(Tree));
		 l->data = data;
		 l->left = NULL;
		 l->right = NULL;
	 }
	 else
	 {
		 if (data > l->data)
		 {
			 l->right=insert(l->right, data);
			 if (getheight(l->left) - getheight(l->right) == -2)
			 {
				 if (l->right->data > data)
					 l = RL(l);
				 else
					 l = RR(l);
			 }

		 }
		 else if (data < l->data)
		 {
			 l->left = insert(l->left, data);
			 if (getheight(l->left) - getheight(l->right) == 2)
			 {
				 if (l->left->data > data)
					 l = LL(l);
				 else
					 l = LR(l);
			 }

		 }
	 }
	 return l;
 }

 int main()
 {
	 int n;
	 int data;
	 Tree A = NULL;
	 scanf("%d", &n);
	 for (int i = 0; i < n; i++)
	 {
		 scanf("%d", &data);
		 A = insert(A, data);
	 }
		 printf("%d", A->data);

 }

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值