有的時候我們感覺自己寫不出代碼,那是因爲我們從未嘗試去去寫。對於數據結構我學的真是很爛,感覺很難,也不想在電腦上去敲,一本數據結構和算法分析我也大約的看了一下,感覺數據結構一點意思也沒有,我只學算法就行了,可是,很多算法都是對數據結構的操作,今天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);
}
所以有些事不是我們做不成,而是我們沒努力做或者根本沒做,當你做了之後才發現原來這麼簡單。