AVL樹c語言實現

有的時候我們感覺自己寫不出代碼,那是因爲我們從未嘗試去去寫。對於數據結構我學的真是很爛,感覺很難,也不想在電腦上去敲,一本數據結構和算法分析我也大約的看了一下,感覺數據結構一點意思也沒有,我只學算法就行了,可是,很多算法都是對數據結構的操作,今天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);
}


所以有些事不是我們做不成,而是我們沒努力做或者根本沒做,當你做了之後才發現原來這麼簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章