#include<stdio.h>
#include<stdlib.h>
#include <iostream>
typedef struct TreeNode {
int data;
int height;
struct TreeNode* right;
struct TreeNode* left;
}TreeNode;
TreeNode* bstNode(TreeNode* T, int data) {
if (T)
{
if (T->data == data)
{
return T;
}
else if (data < T->data)
{
bstNode(T->left, data);
}
else if (data > T->data)
{
bstNode(T->right, data);
}
}
else {
return NULL;
}
}
int getHeight(TreeNode* T) {
return T ? T->height : 0;
}
int max(int a, int b) {
return a > b ? a : b;
}
void rr(TreeNode* node, TreeNode** root) {
TreeNode* temp = node->right;
node->right = temp->left;
temp->left = node;
node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
temp->height = max(getHeight(node->left), getHeight(node->right)) + 1;
*root = temp;
}
void ll(TreeNode* node, TreeNode** root) {
TreeNode* temp = node->left;
node->left = temp->right;
temp->right = node;
node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
temp->height = max(getHeight(node->left), getHeight(node->right)) + 1;
*root = temp;
}
void inser(TreeNode** T, int data) {
if (*T == NULL)
{
*T = (TreeNode*)malloc(sizeof(TreeNode));
(*T)->data = data;
(*T)->height = 0;
(*T)->left = NULL;
(*T)->right = NULL;
}
else if (data < (*T)->data)
{
inser(&(*T)->left, data);
int LeftHeight = getHeight((*T)->left);
int RightHeight = getHeight((*T)->right);
if (LeftHeight-RightHeight == 2)
{
//LL
if (data < (*T)->left->data)
{
ll(*T, T);
}
//LR
else
{
rr((*T)->left, &(*T)->left);
ll(*T, T);
}
}
}
else if (data > (*T)->data)
{
inser(&(*T)->right, data);
int LeftHeight = getHeight((*T)->left);
int RightHeight = getHeight((*T)->right);
if (RightHeight-LeftHeight == 2)
{
// RR
if (data > (*T)->right->data)
{
rr(*T, T);
}
//RL
else
{
ll((*T)->right, &(*T)->right);
rr(*T, T);
}
}
}
(*T)->height = max(getHeight((*T)->left), getHeight((*T)->right))+1;
}
void preorder(TreeNode* T) {
if (T)
{
printf("%d", T->data);
printf("\n");
preorder(T->left);
preorder(T->right);
}
}
int main()
{
TreeNode* T = NULL;
int trymodel[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
{
inser(&T, trymodel[i]);
}
preorder(T);
}
参考: