BST模板
typedef struct TNode {
int val;
struct TNode *left, *right;
} TNode;
TNode* insert(TNode *root, int val){
if(root == NULL){
root = new TNode();
root->val = val;
root->left = root->right = NULL;
} else if(val < root->val){
root->left = insert(root->left, val);
} else
root->right = insert(root->right, val);
return root;
}
TNode* createBST(int pre[], int n){
TNode* root = NULL;
for(int i = 0; i < n; i++){
root = insert(root, pre[i]);
}
return root;
}
TNode* search(TNode* root, int val){
if(root == NULL) return root;
else if(val < root->val) return search(root->left, val);
else if(val > root->val) return search(root->right, val);
else return root;
}
TNode* deleteNode(TNode* root, int val){
if(root == NULL)
return root;
else if(val < root->val)
root->left = deleteNode(root->left, val);
else if(val > root->val)
root->right = deleteNode(root->right, val);
else {
if(root->left == NULL && root->right == NULL)
root = NULL;
else if(root->left != NULL){
TNode* pre = root->left;
while(pre->right != NULL)
pre = pre->right;
root->data = pre->data;
root->left = deleteNode(root->left, pre->data);
} else {
TNode* next = root->right;
while(next->left != NULL)
next = next->left;
root->data = next->data;
root->right = deleteNode(root->right, next->data);
}
}
return root;
}
void destroyBST(TNode* root){
if(root == NULL) return;
destroyBST(root->left);
destroyBST(root->right);
free(root);
}
AVL模板
typedef struct TNode {
int data;
struct TNode *left, *right;
} TNode;
TNode* rotateLeft(TNode *root){
TNode *t = root -> right;
root -> right = t -> left;
t -> left = root;
return t;
}
TNode* rotateRight(TNode *root){
TNode *t = root -> left;
root -> left = t -> right;
t->right = root;
return t;
}
TNode* rotateLeftRight(TNode *root){
root->left = rotateLeft(root->left);
return rotateRight(root);
}
TNode* rotateRightLeft(TNode *root){
root->right = rotateRight(root->right);
return rotateLeft(root);
}
int getHeight(TNode *root){
if(root == NULL) return 0;
return max(getHeight(root->left), getHeight(root->right)) + 1;
}
TNode* insert(TNode *root, int data){
if(root == NULL){
root = new TNode();
root->data = data;
root->left = root->right = NULL;
} else if(data < root->data){
root->left = insert(root->left, data);
if(getHeight(root->left) - getHeight(root->right) == 2){
if(data < root->left->data)
root = rotateRight(root);
else
root = rotateLeftRight(root);
}
} else {
root->right = insert(root->right, data);
if(getHeight(root->left) - getHeight(root->right) == -2){
if(data > root->right->data)
root = rotateLeft(root);
else
root = rotateRightLeft(root);
}
}
return root;
}
TNode* createAVL(int A[], int n){
TNode* root = NULL;
for(int i = 0; i < n; i++){
root = insert(root, A[i]);
}
return root;
}
TNode* search(TNode *root, int data){
if(root == NULL) return NULL;
else if(root->data == data) return root;
else if(data < root->data) return search(root->left, data);
else return search(root->right, data);
}
TNode* findMax(TNode *root){
while(root->right != NULL){
root = root->right;
}
return root;
}
TNode* findMin(TNode* root){
while(root->left != NULL){
root = root->left;
}
return root;
}
TNode* deleteNode(TNode *root, int data){
if(root == NULL) return root;
else if(data < root->data) {
root->left = deleteNode(root->left, data);
} else if(data > root->data) {
root->right = deleteNode(root->right, data);
} else {
if(root->left == NULL && root->right == NULL){
root = NULL;
} else if(root->left != NULL) {
TNode* pre = findMax(root->left);
root->data = pre->data;
root->left = deleteNode(root->left, pre->data);
} else {
TNode* next = findMin(root->right);
root->data = next->data;
root->right = deleteNode(root->right, next->data);
}
}
if(root == NULL) return root;
int heightSub = getHeight(root->left) - getHeight(root->right);
if (heightSub == 2) {
TNode *left = root->left;
if(getHeight(left->left) >= getHeight(left->right)){
root = rotateRight(root);
} else {
root = rotateLeftRight(root);
}
} else if(heightSub = -2) {
TNode *right = root->right;
if(getHeight(right->right) >= getHeight(right->left)){
root = rotateLeft(root);
} else {
root = rotateRightLeft(root);
}
}
return root;
}