最优二叉树的利用程序

原创 2006年05月25日 15:02:00

/*这个函数基本上是写完了,可是我在调试的时候用的时间却是一点也不短,
关键是其中的有一个指针没有重新修改就传给了一个函数,导致了后面程序的错误,函数是没有
一点问题的,是调用函数的时候出现了错误。这个错误以后一定要好好的记住,一不小心就会出现这种
错误了..*/
#include "iostream.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define NULL 0
typedef int status;
typedef char Elemtype;
/*这个程序是想实现最优二叉树的寻找功能*/
typedef struct TREE{
/*data中放的是数据,father中放的是他的父节点的位置,lchild中放的是他的左孩子节点的位置
 rchild中放的是他的右孩子的位置,整个数据结构用得是邻接表的结构*/
//Elemtype data;
int weight;/*这个是权重的大小*/
int father;
int lchild;
int rchild;
}tree,*maptree;
/*今天是星期二,先把这个程序的一个小功能先实现下,其余的程序等吃完饭在来说.先完成的是输入数据并且
统计的一个小函数,这个时候先不考虑算法的优化,只是要程序能够跑起来就可以了..*/
status number(Elemtype *&input,Elemtype *&output,int *&count,int length)
{ /*这个函数的功能是统计一个输入的数据中的字符出现的频率,通过一个返回值确定出现了几个不同
 的字符,output中放的是不同的字符的名称,count中存放的是与output相对应的字符出现的次数*/
 int xunhuan=0;/*这个数放得让我也有些无奈了*/
 output=(Elemtype *)malloc(length*sizeof(Elemtype));
 count=(int *)malloc(length*sizeof(int));
 Elemtype *p1=output;int *array=count;Elemtype *q1=NULL;
 int countlength=0;
 for(int i=0;i<length;i++)
 {
  *(p1++)='0';
 }
 
 for(i=0;i<length;i++)
 {
  *(array++)=0;
 }
 p1=output;array=count;q1=input;
 for(i=0;i<length;i++)
 {
  for(int j=0;j<countlength;j++)
  {  
   if((*(q1+i))==(*(p1+j)))
   {
    (*(array+j))++;
    xunhuan=1;
    j=countlength+1;/*这个时候退出循环*/
   }
  }
  if(xunhuan==0)
  {
  *(p1+countlength)=*(q1+i);
  (*(array+countlength))++;
  countlength++;
  }
  xunhuan=0;/*重新设置下,防止出现了错误*/
 }
 return countlength;
}

status pailie(maptree &T,int length)
{/*这个函数的功能是将一个长度为length的数组按照升序排列*/
maptree linshi=(maptree)malloc(sizeof(tree));
for(int i=0;i<length;i++)
{
 for(int j=(i+1);j<length;j++)
 {
  if(((T+i)->weight)>((T+j)->weight))
  {
   (linshi->father)=(T+i)->father;
   (linshi->lchild)=(T+i)->lchild;
   (linshi->rchild)=(T+i)->rchild;
   (linshi->weight)=(T+i)->weight;

   (T+i)->father=(T+j)->father;
   (T+i)->lchild=(T+j)->lchild;
   (T+i)->rchild=(T+j)->rchild;
   (T+i)->weight=(T+j)->weight;

   (T+j)->father=linshi->father;
   (T+j)->lchild=linshi->lchild;
   (T+j)->rchild=linshi->rchild;
   (T+j)->weight=linshi->weight;

  }
 }
}
free(linshi);
return OK;
}

status erchashu(maptree &T,int *count,int length)
{/*这个函数的功能是将一个数组中的内容排列成一棵最优二叉树,希望能成功了..*/
/*一个有n个节点的最终形成的是(2*n-1)个,所以分配的空间也应该是这么大了.可以确定的是
 这个函数有问题了..*/
 T=(maptree)malloc((2*length-1)*sizeof(tree));
 maptree linshi=T;
 int *q=count;
 int j=0;
 for(int i=0;i<length;i++)
 { 
  (linshi+i)->weight=(*(q++));
  (linshi+i)->father=0;
  (linshi+i)->lchild=0;
  (linshi+i)->rchild=0;
 }

 for(i=length;i<(2*length-1);i++)
 {
  (linshi+i)->weight=0;
  (linshi+i)->father=0;
  (linshi+i)->lchild=0;
  (linshi+i)->rchild=0;
 }
 linshi=T;
 q=count;
 pailie(T,length);

 for(i=0;i<(length-1);i++)
 {/*要进行(n-1)次操作,整个二叉数的操作才会结束.之后的才会变成最优二叉树*/
  (linshi+i+length)->weight=((linshi+j)->weight)+((linshi+j+1)->weight);
  (linshi+i+length)->lchild=j;
  (linshi+i+length)->rchild=j+1;
  (linshi+i+length)->father=0;
  (linshi+j)->father=(i+length);
  (linshi+j+1)->father=(i+length);
  j++;
  j++;
  pailie(T,(length+i+1));/*这个地方的参数其实是可以缩小的*/
 }
return OK;
}


printtree(maptree T,int length)
{/*这个函数的功能是 将一个已经存在的最优二叉树按照一定的顺序输出出来..*/
/*看来是这个函数的问题了,这个输出函数的问题,看起来好解决,怎么搞了这么长时间还没有搞定呢??..
 length是1的时候想单独处理下*/
 if(length==1)
 {
  cout<<0<<endl;
  return OK;
 }
 maptree linshi=NULL;
 int p=0;int j=length-1;int k=0;
 int *array=(int *)malloc(length*sizeof(int));
 int *q=array;
 for(int i=0;i<length;i++)
 {
  (*(q+i))=2;
 }
 linshi=T;
 for(i=0;i<length;i++)
 {/*从树中读取(length-1)次,将所有的节点信息都输出出来*/
  //cout<<"T+"<<i<<"->father="<<(T+i)->father<<endl;
  p=(linshi+i)->father;k=i;
  while(p!=0)
  {
   if(((linshi+p)->lchild)==k)  *(array+j)=0;
   if((linshi+p)->rchild==k) *(array+j)=1;
   j--;
   k=p;
   p=(linshi+p)->father;
   
  }
  for(j=0;j<length;j++)
  { 
   if((*(array+j))!=2)
   cout<<(*(array+j));
  }
  cout<<endl;
  /*再次复位下*/
  for(j=0;j<length;j++)
  (*(q+j))=2;/*数组也复位下看看有什么结果了..*/
  j=length-1;/*搞了好几次错误的原因居然是这个地方的复位工作没有做好,小结问题,以后要注意了..*/
 }
return OK;
}

 

int main()
{
 int length;
 int i=0;
 int countlength=0;
 maptree T=NULL;
 Elemtype * M=NULL;Elemtype * linshi=NULL;
 cout<<"please input a number:"<<endl;
 cin>>length;
 cout<<endl;
 M=(Elemtype *)malloc(length*sizeof(Elemtype));
 linshi=M;
 for(i=0;i<length;i++)
 {
  cin>>(*(linshi+i));
 }
 Elemtype *output=NULL;
 int *count=NULL;
 cout<<"please wait for a few minute"<<endl;
 countlength=number(linshi,output,count,length);

 erchashu(T,count,countlength);

 printtree(T,countlength);
 return 0;

}

/*今天就写到这里了,明天或者是晚上再补充起来就可以了,是内存处理的问题,指针的指向现在
有问题,好了,到次为止了,吃饭了!!*/
/*编译和连接都没有问题,但是结果却有问题,这个确实是不怎么好解决的,只能是慢慢的找了
,找的方法有很多,可是我还是习惯了一直按F10解决问题,这次当然不例外了..好了,开始解决问题了..
搞定之后就去上自习,再将这个发到CSDN上去了..*/

动态规划--最优二叉树问题

1、问题描速:        设 S={x1, x2, ···, xn}  是一个有序集合,且x1, x2, ···, xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:...
  • sinat_24520925
  • sinat_24520925
  • 2015年01月19日 20:38
  • 1726

算法基础(八):超详细最优二叉树构建(1)

算法基础(八):超详细最优二叉树构建(1)
  • huiguimoyu
  • huiguimoyu
  • 2014年04月27日 18:55
  • 1783

C语言实现最优二叉树——霍夫曼(Huffman)树算法

赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树。在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权。从树根结点到该结点之间的路径长度与该结点...
  • u011248694
  • u011248694
  • 2014年04月07日 19:27
  • 4489

标题:利用动态规划求解最优二叉树

摘要:二叉查找书所要查找的目标出现的频率可能不一样,因此它们在二叉查找树上的位置不同,查找的代价也不同.(1)基本思路:[1]因为二叉查找树的左儿子一定要小于右儿子,这里用单词作为元素.首先按照首字母...
  • pp634077956
  • pp634077956
  • 2015年09月06日 19:50
  • 558

哈夫曼(最优二叉树)

最优二叉树: 定义: 路径:数的路径就是从书中的一个节点到树中的另一个节点的分支的个数长度,路径上的分支数目我们称之为长度 树的路径长度:从树根到每一个节点的长度之和(完全二叉树是一种树的路径最...
  • ltyqljhwcm
  • ltyqljhwcm
  • 2016年09月08日 16:15
  • 1099

[C/C++] 构造最优二叉树-赫夫曼(哈夫曼、Huffman)树算法实现

一、基本概念 1、赫夫曼(Huffman)树又称最优二叉树或最优搜索树,是一种带权路径长度最短的二叉树。在许多应用中,常常赋给树中结点一个有某种意义的实数,称此实数为该结点的权。从树根结点到该结点之...
  • super_man_ww
  • super_man_ww
  • 2016年10月13日 09:22
  • 2239

哈夫曼树(最优二叉树)的创建

哈夫曼树是带权路径最小的一种特殊二叉树,所以也称最优二叉树。 在这里不讨论基本概念如如何计算路径等,而只着重于树的创建,具体过程让我们举例而言。其基本的原理为:将所有节点一开始都视为森林,每次从森林...
  • Ava1anche
  • Ava1anche
  • 2015年07月23日 17:16
  • 1423

构造最优二叉树-赫夫曼(Huffman)树算法

http://blog.163.com/zhoumhan_0351/blog/static/3995422720098275836215/ 构造最优二叉树-赫夫曼(Huffman)树算法   ...
  • fu_shuwu
  • fu_shuwu
  • 2015年05月30日 09:56
  • 964

算法java实现--动态规划--最优二叉树搜索

最优erchasoushuo算法的java实现(动态规划法) 具体问题描述以及C/C++实现参见网址 http://blog.csdn.net/liufeng_king/article/d...
  • qipanliming
  • qipanliming
  • 2014年04月28日 16:15
  • 2356

创建最优二叉树程序

// 构建最优二叉树程序#include #include // 按照升序排列,元素表示节点的权值static int array[] = {1 , 2 , 3 , 4 , 5 , 6 , 7};//...
  • tq02h2a
  • tq02h2a
  • 2009年02月15日 00:06
  • 947
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最优二叉树的利用程序
举报原因:
原因补充:

(最多只允许输入30个字)