有的时候我们感觉自己写不出代码,那是因为我们从未尝试去去写。对于数据结构我学的真是很烂,感觉很难,也不想在电脑上去敲,一本数据结构和算法分析我也大约的看了一下,感觉数据结构一点意思也没有,我只学算法就行了,可是,很多算法都是对数据结构的操作,今天c语言课无聊,带了自己的数据结构看,然后一下子就打开了二叉树,二叉树中的AVL树我知道原理,却从未自己敲过,感觉太难了,到时候直接抄代码就行了,可是今天不知道哪根筋不对,越看越想看,越看越像敲,我真的自己把它敲出来了:
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int height;
int value;
struct Node *leftchild;
struct Node *rightchild;
}Node;
int Max(int a,int b);
int Height(Node *node);
Node * SingleLeft(Node *k1);
Node * SingleRight(Node *k1);
Node * DoubleLeft(Node *k1);
Node * DoubleRight(Node *k1);
Node * insert(Node *node,int n);
Node * delet(Node *node,int n);
int Max(int a,int b)
{
return a>b?a:b;
}
int Height(Node *node)
{
if(node == NULL)
{
return -1;
}
else
{
return node->height;
}
}
Node * SingleLeft(Node *k1)
{
Node *k2;
k2 = k1->leftchild;
k1->rightchild = k2->rightchild;
k2->rightchild = k1;
k1->height = Max(Height(k1->leftchild),Height(k1->rightchild))+1;
k2->height = Max(Height(k1->leftchild),Height(k1->rightchild))+1;
return k2;
}
Node * SingleRight(Node *k1)
{
Node *k2;
k2 = k1->rightchild;
k1->rightchild = k2->leftchild;
k2->leftchild = k1;
k1->height = Max(Height(k1->leftchild),Height(k1->rightchild))+1;
k2->height = Max(Height(k1->leftchild),Height(k1->rightchild))+1;
return k2;
}
Node * DoubleLeft(Node *k1)
{
k1->leftchild = SingleRight(k1->leftchild);
return SingleLeft(k1);
}
Node * DoubleRight(Node *k1)
{
k1->rightchild = SingleLeft(k1->rightchild);
return SingleRight(k1);
}
Node * insert(Node *node,int n)
{
if(node == NULL)
{
node = (Node * )malloc(sizeof(Node));
node->height = 0;
node->leftchild = node->rightchild =NULL;
node->value = n;
}
else
{
if(n<=node->value)
{
node->leftchild = insert(node->leftchild,n);
if(Height(node->leftchild) - Height(node->rightchild) == 2)
{
if(n<node->leftchild->value)
{
node = SingleLeft(node);
}
else
{
node = DoubleLeft(node);
}
}
}
else
{
node->rightchild = insert(node->rightchild,n);
if(Height(node->leftchild) - Height(node->rightchild) == -2)
{
if(n>node->rightchild->value)
{
node = SingleRight(node);
}
else
{
node = DoubleRight(node);
}
}
}
}
node->height = Max(Height(node->leftchild),Height(node->rightchild)) + 1;
return node;
}
Node * delet(Node *node,int n)
{
Node *p = NULL,*q = NULL;
if(node == NULL)
{
printf("error");
}
else
{
if(node->value == n)
{
q = node;
if(q->rightchild!=NULL)
{
q = node->rightchild;
if(q->leftchild == NULL)
{
q->leftchild = node->leftchild;
node = q;
}
else
{
while(q->leftchild!=NULL)
{
p = q->leftchild;
if(p->leftchild != NULL)
{
q = p;
}
}
q->leftchild = p->rightchild;
p->leftchild = node->leftchild;
p->rightchild = node->rightchild;
node = p;
}
}
else
{
node = node->leftchild;
}
free(node);
}
else
{
if(node->value >= n)
node = delet(node->leftchild,n);
else
{
node = delet(node->rightchild,n);
}
}
}
return node;
}
int main()
{
Node *node = NULL;
node = insert(node,3);
node = insert(node,1);
node = insert(node,23);
node = insert(node,33);
node = insert(node,45);
node = delet(node,23);
printf("%d",node->rightchild->leftchild->value);
}
所以有些事不是我们做不成,而是我们没努力做或者根本没做,当你做了之后才发现原来这么简单。