【机试练习】【C++】【codeup 1173 Problem A】算法9-9~9-12:平衡二叉树的基本操作

24 篇文章 0 订阅
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

struct node{
	int data = -1;
	int height = 1;
	node* lchild = NULL;
	node* rchild = NULL;
};

node* new_node(int v){
	node* root = new node;
	root -> data = v;
	root -> lchild = NULL;
	root -> rchild = NULL;
	root -> height = 1;
	return root;
}

int get_height(node* root){
	if(root == NULL) return 0;
	return root -> height;
}

int get_balancer_factor(node* root){ // 计算一个节点平衡因子 
	if(root == NULL) return 0;
	return get_height(root -> lchild) - get_height(root -> rchild);
}

int update_height(node* root){ // 根的高度是左右子树高度较大值再加1 
	if(root == NULL) return 0;
	return max(get_height(root -> lchild), get_height(root -> rchild)) + 1;
}

void L(node* &root){
	node* temp = root -> rchild;
	root -> rchild = root -> rchild -> lchild;
	temp -> lchild = root;
	update_height(root); // 需要更新节点的高度 
	update_height(temp); // 从下往上 
	root = temp; // 这里需要修改根节点的位置 
}

void R(node* &root){
	node* temp = root -> lchild;
	root -> lchild = temp -> rchild;
	temp -> rchild = root;
	update_height(root);
	update_height(temp);
	root = temp;
}

void insert(node* &root, int v){
	if(root == NULL){
		root = new_node(v);
		return;
	}
	if(v < root -> data){ // 往左子树插入 
		insert(root -> lchild, v);
		update_height(root);
		// 判断是不是插成了LL 或者LR型
		if(abs(get_balancer_factor(root)) == 2){
			if(get_balancer_factor(root -> lchild) == 1){ // LL型 
				R(root);
			} else if(get_balancer_factor(root -> lchild) == -1){ //LR型 
				L(root -> lchild);
				R(root);
			} 
		}
	} else { // 往右子树插入 
		insert(root -> rchild, v);
		update_height(root);
		if(abs(get_balancer_factor(root)) == 2){
			if(get_balancer_factor(root -> rchild) == -1){ // RR型 
				L(root); 
			} else if(get_balancer_factor(root -> rchild) == 1){// RL型 
				R(root -> rchild);
				L(root); 
			}
		}
	}
}

node* create_avl_tree(int data[], int n){
	node* root = NULL;
	for(int i = 0; i < n; i++){
		insert(root, data[i]);
	}
	return root;
}


node* search(node* root, int v){
	if(root == NULL) return NULL;
	if(root -> data == v){
		return root;
	} else if(v < root -> data){
		return search(root -> lchild, v);
 	} else{
 		return search(root -> rchild, v);
	 }
}

int prepare[1000] = {-1};
int main(){
	int n = -1, k = -1;
	scanf("%d %d", &n, &k);
	int tmp = -1;
	node * root = NULL;
	while(n --){
		scanf("%d", &tmp);
		insert(root, tmp); 
	}
	while(k --){
		scanf("%d", &tmp);
		if(search(root, tmp) != NULL){
			printf("1");
		} else{
			printf("0");
		}
		if(k >= 1){
			printf(" ");
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值