平衡二叉树c语言实现

版权声明:想不开 想不开 想不开 https://blog.csdn.net/zuoside__lord/article/details/88918908

/*以下代码来自《数据结构与算法分析c语言描述》 这个代码比那个《大话数据结构》上面的少很多,所以选择这个,但是《大话数据结构》上面的关于平衡二叉树解析比较详细但是代码太长了太讨厌了 我抄的过程中小小改动了,下面的static都没有什么用,原书是专门写了个头文件所以需要吧,,有的可以去掉。我在想考试应该不会考这个具体代码因为好像c++有很多算法模板 但是会考相关的*/

#include<stdio.h>
#include<stdlib.h>
struct avlnode;
typedef struct avlnode *position;
typedef struct avlnode *avltree;
avltree insert(int x,avltree t);
struct avlnode
{
	int e;
	avltree left;
	avltree right;
	int height;
};
static int Height(position p)
{
	if(p==0)
		return -1;
	else
		return p->height;
}
int max(int a,int b)
{
	return a>b?a:b;
}
static position SingleRotateWithLeft(position k2)
{
	position k1;
	k1=k2->left;
	k2->left=k1->right;
	k1->right=k2;
	k2->height=max(Height(k2->left),Height(k2->right))+1;
	k1->height=max(Height(k1->left),k2->height)+1;
	return k1;
}
static position SingleRotateWithRight(position k5)
{	
	position k6;
	k6=k5->right;
	k5->right=k6->left;
	k6->left=k5;
	k5->height=max(Height(k5->left),Height(k5->right))+1;
	k6->height=max(Height(k6->right),k5->height)+1;
	return k6;
}

static position DoubleRotateWithLeft(position k3)
{
	k3->left=SingleRotateWithRight(k3->left);
	return SingleRotateWithLeft(k3);
}
static position DoubleRotateWithRight(position k4)
{
	k4->right=SingleRotateWithLeft(k4->right);
	return SingleRotateWithRight(k4);
}
avltree insert(int x,avltree t)
{
	if(t==0)
	{
		t=malloc(sizeof(struct avlnode));
		if(t==0)
			printf("out of space!");
		else
		{
			t->e=x;
			t->height=0;
			t->left=t->right=0;
		}
	}
	else if(x<t->e)
	{
		t->left=insert(x,t->left);
		if(Height(t->left)-Height(t->right)==2)
			if(x<t->left->e)
				t=SingleRotateWithLeft(t);
			else
				t=DoubleRotateWithLeft(t);
	}
	else if(x>t->e)
	{
		t->right=insert(x,t->right);
		if(Height(t->right)-Height(t->left)==2)
			if(x>t->right->e)
				t=SingleRotateWithRight(t);
			else
				t=DoubleRotateWithRight(t);
	}
	t->height=max(Height(t->left),Height(t->right))+1;
	return t;
}
avltree create(int *a,int n,avltree b)
{
	b=0;
	int i;
	for(i=0;i<n;i++)
	{
		b=insert(a[i],b);
	}
	return b;
}
//测试输出
void print(avltree t)
{
	if(t)
	{
		print(t->left);
		printf("%d ",t->e);
		print(t->right);
	}
}
		
int main()
{
	int a[]={4,3,5,1,2};
	int i;
	avltree t,p;
	p=create(a,5,t);
	print(p);
}

 慢慢理解,果然二叉树只有和递归搞在一起代码量才会少不用递归解决的话实现起来好麻烦。这个算法比大话数据结构那个好看多了。好理解太多了。。

想出这个算法的人还有写出这个算法的人好了不起啊,每一步都判断,每一步都是按照它的意识,即使当前错了,因为之前都是对的,所以也很好修改还不会影响其他。。。

猜你喜欢

转载自blog.csdn.net/zuoside__lord/article/details/88918908