#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;
}
【机试练习】【C++】【codeup 1173 Problem A】算法9-9~9-12:平衡二叉树的基本操作
最新推荐文章于 2020-02-27 19:00:00 发布