C语言 04-树5 Root of AVL Tree

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property.
Figures 1-4 illustrate the rotation rules.
这里写图片描述
这里写图片描述
这里写图片描述)
这里写图片描述

Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤20) which is the total number of keys to be inserted. Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the root of the resulting AVL tree in one line.

Sample Input 1:

5
88 70 61 96 120

Sample Output 1:

70

Sample Input 2:

7
88 70 61 96 120 90 65

Sample Output 2:

88
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AVL是一种平衡二叉C语言中可以通过结构体和指针来实现AVL。下面是一个简单的AVL实现示例,包括AVL的创建、插入、删除和遍历操作。 ```c #include <stdio.h> #include <stdlib.h> // 定义AVL节点结构体 struct node { int data; int height; struct node *left; struct node *right; }; // 获取节点高度 int get_height(struct node *root) { if (!root) { return -1; } else { return root->height; } } // 获取节点平衡因子 int get_balance_factor(struct node *root) { if (!root) { return 0; } else { return get_height(root->left) - get_height(root->right); } } // 左旋转 struct node* left_rotate(struct node *root) { struct node *new_root; new_root = root->right; root->right = new_root->left; new_root->left = root; root->height = 1 + (get_height(root->left) > get_height(root->right) ? get_height(root->left) : get_height(root->right)); new_root->height = 1 + (get_height(new_root->left) > get_height(new_root->right) ? get_height(new_root->left) : get_height(new_root->right)); return new_root; } // 右旋转 struct node* right_rotate(struct node *root) { struct node *new_root; new_root = root->left; root->left = new_root->right; new_root->right = root; root->height = 1 + (get_height(root->left) > get_height(root->right) ? get_height(root->left) : get_height(root->right)); new_root->height = 1 + (get_height(new_root->left) > get_height(new_root->right) ? get_height(new_root->left) : get_height(new_root->right)); return new_root; } // 创建AVL struct node* create_avl_tree() { struct node *root; int data; printf("请输入根节点的数据:"); scanf("%d", &data); root = (struct node*) malloc(sizeof(struct node)); if (!root) { printf("内存分配失败\n"); exit(1); } root->data = data; root->height = 0; root->left = NULL; root->right = NULL; return root; } // 插入节点 struct node* insert_node(struct node *root, int data) { if (!root) { root = (struct node*) malloc(sizeof(struct node)); if (!root) { printf("内存分配失败\n"); exit(1); } root->data = data; root->height = 0; root->left = NULL; root->right = NULL; } else if (data < root->data) { root->left = insert_node(root->left, data); if (get_balance_factor(root) == 2) { if (get_balance_factor(root->left) == 1) { root = right_rotate(root); } else if (get_balance_factor(root->left) == -1) { root->left = left_rotate(root->left); root = right_rotate(root); } } } else if (data > root->data) { root->right = insert_node(root->right, data); if (get_balance_factor(root) == -2) { if (get_balance_factor(root->right) == -1) { root = left_rotate(root); } else if (get_balance_factor(root->right) == 1) { root->right = right_rotate(root->right); root = left_rotate(root); } } } else { printf("节点已存在\n"); } root->height = 1 + (get_height(root->left) > get_height(root->right) ? get_height(root->left) : get_height(root->right)); return root; } // 删除节点 struct node* delete_node(struct node *root, int data) { struct node *p; if (!root) { printf("节点不存在\n"); } else if (data < root->data) { root->left = delete_node(root->left, data); if (get_balance_factor(root) == -2) { if (get_balance_factor(root->right) == -1) { root = left_rotate(root); } else if (get_balance_factor(root->right) == 1) { root->right = right_rotate(root->right); root = left_rotate(root); } } } else if (data > root->data) { root->right = delete_node(root->right, data); if (get_balance_factor(root) == 2) { if (get_balance_factor(root->left) == 1) { root = right_rotate(root); } else if (get_balance

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值