求解最优二叉树所有叶子结点的带权路径长度之和

原创 2015年07月10日 11:19:41

根据网上的相关资料,通过构造哈夫曼树求解最优二叉树所有叶子结点的带权路径长度之和

 

# include<stdio.h>
#include<malloc.h>
#define maxsize 30;
/*
    霍夫曼树求解最佳二叉树
 完成时间:2015-7-10
*/
typedef struct ptree
{
 float w;
 struct ptree *lchild;
 struct ptree *rchild;
}ptree,*ptt;//二叉树定义,w为权值
typedef struct pforest
{
 struct pforest *link;
 struct ptree *root;
}pforest;//森林定义。
float WPL=0;
int n=0;
struct pforest *inforest(struct pforest *f,struct ptree *t)
{
 //根据权值的大小将二叉树一个个放到森林里。即将t插入该森林
 struct pforest *p,*q,*r;
 struct ptree *ti;
 //开辟新的空间,便于插入至森林
 r=(pforest *)malloc(sizeof(pforest));
 r->link=NULL;
 r->root=t;
 q=f;
 p=f->link;
 while(p!=NULL)
 {
  ti=p->root;//取出此树的根节点
  if(t->w>ti->w)
  {
   q=p;
   p=p->link;
  }
  else
   p=NULL;
 }//while
 r->link=q->link;
 q->link=r;//插入新的二叉树
 return f;
}
struct ptree *hafm(float w[])
{
  pforest *p1,*p2,*f;
  ptree *t,*t1,*t2;//用于保存取出来的两个节点
  ptree *ti;//新节点
 int i;
 f=(pforest *)malloc(sizeof(pforest));
 f->link=NULL;
// printf("%d ",n);
 for(i=0;i<n;i++)
 {
  ti=(ptree*)malloc(sizeof(ptree));
  ti->w=w[i];
  ti->lchild=NULL;
  ti->rchild=NULL;
 // printf("%d ",i);
  f=inforest(f,ti);//将ti挂到一棵树上面,初试化的时候形成了n颗树。
 }//初始化
// printf("\n");
 while(((f->link)->link)!=NULL)//f为一颗森林,如果至少含有两棵树则继续进行
 {
  p1=f->link;
  p2=p1->link;
  //f为一有序链表,取出前2颗二叉树。
  f->link=p2->link;
  t1=p1->root;//取出树
  t2=p2->root;
  free(p1);
  free(p2);
  //接着形成新的节点
  t=(ptree*)malloc (sizeof(ptree));
  t->w=(t1->w)+(t2->w);
  t->lchild=t1;
  t->rchild=t2;//产生新的二叉树
  f=inforest(f,t);//挂到树上
 }
 p1=f->link;
 t=p1->root;//保存最终二叉树
 free(f);//此时为最终情况,即最终的二叉树,*/
 return t;
}
void Input_Node(float w[])
{
 printf("Please Input the sum of node:\n");
 scanf("%d",&n);
 printf("请依次输入权重值:\n");
 for(int i=0;i<n;i++)
 {
  scanf("%f",&w[i]);
 }
}//正常
void travel(struct ptree *head,int num)
{
 struct ptree *p;
 p=head;
 if(p!=NULL)
 {
  if(((p->lchild)==NULL)&&((p->rchild)==NULL))
  {
  // printf("%lf",p->w);
  // printf("\n");
   WPL=WPL+num*(p->w);
  }
  travel(p->lchild,num+1);
  travel(p->rchild,num+1);//
 }
}
void main ()
{

 struct ptree *head;
 float w[20];
 Input_Node(w);
 head=hafm(w);
 travel(head,0);
 printf("\n最优二叉树所有叶子结点的带权路径长度之和:%lf\n",WPL);
 n=0;
}

附图一张:

 

UVa 548(二叉树的递归遍历、dfs)

题意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。如果有多解,该叶子本身的权应尽量小。输入中每两行表示一棵树,其中第一行为...

UVa 548 - Tree【二叉树的递归遍历(DFS)】

548 - Tree You are to determine the value of the leaf node in a given binary tree that is the termin...

DS之求解二叉树的叶子结点和深度

这一次需要用到的是二叉树的相关知识,具体的解释会在后面的博客讲述。         如果实现上面的功能就先要构造二叉树以及创造二叉树,还需要求解叶子结点个数函数以及深度函数,这都需要自己去在数据结构...

C二叉树的基本操作---创建、遍历、求深度、求叶子结点

C语言二叉树的基本操作,创建遍历深度叶子

计算二叉树中叶子结点的数目

  • 2009年12月17日 21:53
  • 20KB
  • 下载

用C语言求二叉树叶子结点

  • 2009年04月18日 20:51
  • 2KB
  • 下载

输出二叉树中所有从根结点到叶子结点的路径

// 输出二叉树中所有从根结点到叶子结点的路径.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include #include using names...

二叉树中从根结点到叶子结点的所有路径(递归实现)

假设我们要输出二叉树中所有从根节点到叶子节点的所有路径,我们采用前序遍历二叉树的思想,每遇到一个节点,我们把该节点存储在数组中,然后判断该节点是否为叶子节点,如果是叶子节点,我们输出从根节点到该叶子节...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求解最优二叉树所有叶子结点的带权路径长度之和
举报原因:
原因补充:

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