C语言数据结构:二叉排序树和哈夫曼树

文章目录

    • 二叉排序树
    • 哈夫曼树

二叉排序树

个人理解:满足 左孩子<根结点<右孩子 的二叉树即为二叉排序树。

这块考研要求不高,所以我只按照书本总结了插入建立和查找的程序:

#include
#include
#include

typedef struct BST{  //结构体
	int data;
	struct BST *lchild,*rchild;
}*tree,node;

node *search(tree t,int x)
{
	while(t!=NULL&&x!=t->data)
	{
		if(x<t->data)
			t=t->lchild;
		else t=t->rchild;
	}
	return t;
}

void Insert(tree &t,int k)
{
	if(t==NULL)
	{
		t=(node *)malloc(sizeof(node));
		t->data=k;
		t->lchild=t->rchild=NULL;
	}
	else if(k==t->data)
	{
		printf("\n树中已有数据%d!\n",k);
	}
	else if(k>t->data)
	{
		Insert(t->rchild,k);
	}
	else
	{
		Insert(t->lchild,k);
	}
}

tree create(tree &t,int str[],int n)
{
	t=NULL;
	int i=0;
	while(i<n)
	{
		Insert(t,str[i]);
		++i;
	}
	return t;
}

void main()
{
	int *p,n,i,x;
	tree t;
	node *r;
	printf("请输入结点个数:");
	scanf("%d",&n);
	p=(int *)malloc(n*sizeof(int));
	printf("请输入各结点值(以回车隔开)");
	for(i=0;i<n;i++)
	{
		scanf("%d",&x);
		p[i]=x;
	}
	t=create(t,p,n);
	printf("建立成功!");
	printf("请输入需要查找的结点元素:");
	scanf("%d",&i);
	r=search(t,i);
	printf("查找成功!该结点的左孩子为:%d",r->lchild->data);
}

编译结果:
C语言数据结构:二叉排序树和哈夫曼树_第1张图片
C语言数据结构:二叉排序树和哈夫曼树_第2张图片
总结:
二叉排序树比较好理解,配合几道课后习题应该没有啥问题。

哈夫曼树

主要应用为哈夫曼编码和二路合并算法,其本身的构造也不算简单,而且已经很多年没考,应当重视。

代码如下:

#include
#include
#include

typedef struct tree
{
	int data;
	struct tree *lchild,*rchild;
}*huffmantree,huffmannode;

void find_two_min(huffmantree jiedian[],int n,int *p1,int *p2)  //取p1,p2的内容,p1为最小,p2为第二小
{
	int i=0;
	int min1=999;
	int min2=999;
	for(i=0;i<n;i++)
	{
		if(jiedian[i]!=NULL)
		{
			if(jiedian[i]->data<min1)
			{
				min2=min1;
				min1=jiedian[i]->data;
				*p2=*p1;
				*p1=i;
			}
			else if(jiedian[i]->data<min2)
			{
				min2=jiedian[i]->data;
				*p2=i;
			}
		}
	}
}

huffmantree create(int p[],int n)
{
	int i,min1=0,min2=0;
	huffmantree jiedian[100];
	huffmantree r=NULL;
	for(i=0;i<n;i++)
	{
		r=(huffmannode *)malloc(sizeof(huffmannode));
		memset(r,0,sizeof(huffmannode));   //节点初始化
		r->data=p[i];
		r->lchild=r->rchild=NULL;
		jiedian[i]=r;
	}
	for(i=0;i<n-1;i++)
	{
		find_two_min(jiedian,n,&min1,&min2);
		r=(huffmannode *)malloc(sizeof(huffmannode));
		memset(r,0,sizeof(huffmannode));   //节点初始化
		r->data=jiedian[min1]->data+jiedian[min2]->data;
		r->lchild=jiedian[min1];
		r->rchild=jiedian[min2];
		jiedian[min2]=r;
		jiedian[min1]=NULL;
	}
	return r;
}
void preorder(huffmantree t)
{
	if(t)
	{
		printf("%d ",t->data);
		preorder(t->lchild);
		preorder(t->rchild);
	}
}

void leaforder(huffmantree t)
{
	if(t)
	{
		if(!t->lchild&&!t->rchild) printf("%d ",t->data);
		leaforder(t->lchild);
		leaforder(t->rchild);
	}
}

void main()
{
	int *p,n,i;
	huffmantree t;
	printf("请输入结点数:");
	scanf("%d",&n);
	p=(int *)malloc(sizeof(int)*n);
	printf("请输入各个结点值:");
	for(i=0;i<n;i++)
	{
		scanf("%d",&p[i]);
	}
	t=create(p,n);
	printf("哈夫曼树先序序列为:\n");
	preorder(t);
	printf("\n");
	printf("叶结点排序(最优合并顺序)为:\n");
	leaforder(t);
}

编译结果:
C语言数据结构:二叉排序树和哈夫曼树_第3张图片
实际构成的树如下:
C语言数据结构:二叉排序树和哈夫曼树_第4张图片

你可能感兴趣的:(数据结构,考研)