大二时候写的烂代码,翻出来复习复习(o(╯□╰)o)。

代码:

#include <stdio.h>
#include <stdlib.h>
#define Max_Size 100
struct Binode{
char res;
struct Binode *lchild,*rchild;
};
struct Binode* First_Creat_Bitree(){//建立一棵二叉树,这里按照先序建立二叉树是有条件的,输入的序列中包含空节点。
char ch;
struct Binode *p;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else{
p=(struct Binode *)malloc(sizeof(struct Binode));
p->res=ch;
p->lchild=First_Creat_Bitree();
p->rchild=First_Creat_Bitree();
}
return p;
} void PreOrder_Travel_Bitree(struct Binode *p){//按先序遍历二叉树
if(p){
printf("%c ",p->res);
PreOrder_Travel_Bitree(p->lchild);
PreOrder_Travel_Bitree(p->rchild);
}
} int max(int a,int b){
return (a>b)?a:b;
}
int Get_High(struct Binode *p){//求一棵二叉树的高度
if(p==NULL)
return ;
else
return max(Get_High(p->lchild),Get_High(p->rchild))+;
} int Get_Leaf_Node(struct Binode *p){//求二叉树的叶子节点个数
if(p==NULL)
return ;
else if(p->lchild==NULL&&p->rchild==NULL)
return ;
else
return Get_Leaf_Node(p->lchild)+Get_Leaf_Node(p->rchild);
} struct Qnode{ //队列的基本操作
struct Binode *data; //入队的指针
struct Qnode *next;
};
struct Link_Queue{
struct Qnode *front;
struct Qnode *rear;
}; void Init_Link_Queue(struct Link_Queue &s){
s.front=s.rear=(struct Qnode*)malloc(sizeof(struct Qnode));
if(s.front==NULL)
printf("开辟内存失败\n");
s.front->next=NULL;
} void Enter_Link_Queue(struct Link_Queue &s,struct Binode *ch){
struct Qnode *p;
p=(struct Qnode*)malloc(sizeof(struct Qnode));
p->data=ch;
p->next=NULL;
s.rear->next=p;
s.rear=p;
} void Delete_Link_Queue(struct Link_Queue &s){
struct Qnode *p;
if(s.front==s.rear)
printf("队列已空\n");
p=s.front->next;
s.front->next=p->next;
if(p==s.rear)
s.rear=s.front;
free(p);
} int Empty_Link_Queue(struct Link_Queue &s){
if(s.front==s.rear)
return ;
else
return ;
}
void Level_Order_Travel(struct Binode *p){//层序遍历一棵二叉树
struct Link_Queue s;
struct Binode *tmp1,*tmp2;
Init_Link_Queue(s);
Enter_Link_Queue(s,p);
while(!Empty_Link_Queue(s)){
printf("%c ",s.front->next->data->res);
tmp1=s.front->next->data->lchild;//出队列前将其左右儿子保存
tmp2=s.front->next->data->rchild;
Delete_Link_Queue(s);
if(tmp1)
Enter_Link_Queue(s,tmp1);//判断左右儿子是否为空,非空则入队列
if(tmp2)
Enter_Link_Queue(s,tmp2);
}
} struct Sq_Stack{ //栈的基本操作
struct Binode **base;//入栈的是指针,因此栈顶指针与基址指针为二级指针
struct Binode **top;
int stack_size;
}; void Init_Sq_stack(struct Sq_Stack &s){
s.base=(struct Binode** )malloc(Max_Size*sizeof(struct Binode * ));
if(!s.base)
printf("内存开辟失败\n");
s.top=s.base;
s.stack_size=Max_Size;
} void Push_Sq_Stack(struct Sq_Stack &s,struct Binode *p){
*(s.top)=p;
s.top++;
} void Pop_Sq_Stack(struct Sq_Stack &s){
if(s.base==s.top)
printf("栈已空\n");
else
s.top--;
} int Empty_Sq_Stack(struct Sq_Stack &s){
if(s.base==s.top)
return ;
else
return ;
} struct Binode* Get_Top(struct Sq_Stack &s){
struct Binode *p;
p=*(s.top-);
return p;
}
void InOrder_Travel(struct Binode *p){//中序遍历二叉树的非递归算法
struct Sq_Stack s;
struct Binode *tmp,*tmp1;
Init_Sq_stack(s);
Push_Sq_Stack(s,p);
while(!Empty_Sq_Stack(s)){
while(Get_Top(s)){
tmp=Get_Top(s);
Push_Sq_Stack(s,tmp->lchild);
}
Pop_Sq_Stack(s);
if(!Empty_Sq_Stack(s)){
printf("%c ",Get_Top(s)->res);
tmp1=Get_Top(s);//出栈前将其右儿子保存
Pop_Sq_Stack(s);
Push_Sq_Stack(s,tmp1->rchild);//右儿子入栈
}
}
} int main()
{
struct Binode *p;
int high;
int num;
printf("建立一颗二叉树并用先序遍历将其输出\n");
p=First_Creat_Bitree();
PreOrder_Travel_Bitree(p);
printf("\n"); printf("求二叉树的高度\n");
high=Get_High(p);
printf("%d \n",high); printf("求该二叉树的叶子节点个数\n");
num=Get_Leaf_Node(p);
printf("%d \n",num); printf("二叉树的层序遍历\n");
Level_Order_Travel(p);
printf("\n"); printf("二叉树的中序遍历:非递归\n");
InOrder_Travel(p);
printf("\n");
return ;
}

测试结果:

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define inf 99999999
struct HuffmanNode{
int weight;
int lchild,rchild,parent;
};
void Select(struct HuffmanNode *p,int n,int& num1,int& num2){
int i;
int min1,min2;
min1=inf;
for(i=;i<=n;i++){ //在还没有被选择的节点中,选择最小的节点
if(p[i].parent==&&p[i].weight<min1){
min1=p[i].weight;
}
}
for(i=;i<=n;i++){
if(p[i].parent==&&p[i].weight==min1){//找到该节点的序号
num1=i;
p[i].parent=;//将其父母置为非空,表明这个节点已经被选
break;
}
}
min2=inf;
for(i=;i<=n;i++){ //在还没有被选择的节点中,选择次小的节点
if(p[i].parent==&&p[i].weight<min2){
min2=p[i].weight;
}
}
for(i=;i<=n;i++){
if(p[i].parent==&&p[i].weight==min2){ //找到该节点的序号
num2=i;
p[i].parent=;//将其父母置为非空,表明这个节点已经被选
break;
}
}
}
void Huffman_Coding(int n,struct HuffmanNode* &head,char** &HC){
int m,i,s1,s2;//构造赫夫曼树
if(n<)
printf("无法构造赫夫曼树\n");
m=*n-;
head=(struct HuffmanNode *)malloc((m+)*sizeof(struct HuffmanNode));//0号元素不用
for(i=;i<=m;i++){
if(i<=n)
scanf("%d",&head[i].weight);
else
head[i].weight=;
head[i].lchild=;
head[i].rchild=;
head[i].parent=;
}
for(i=n+;i<=m;i++){
Select(head,i-,s1,s2);
head[s1].parent=i;
head[s2].parent=i;
head[i].lchild=s1;
head[i].rchild=s2;
head[i].weight=head[s1].weight+head[s2].weight;
}
char *cd;
int start,c,f; //对赫夫曼树进行编码
HC=(char **)malloc((n+)*sizeof(char *));
cd=(char *)malloc(n*sizeof(char));
cd[n-]='\0';
for(i=;i<=n;i++){
start=n-;
for(c=i,f=head[i].parent;f!=;c=f,f=head[f].parent){
if(head[f].lchild==c)
cd[--start]='';
else
cd[--start]='';
}
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
int main()
{
int n,i;
struct HuffmanNode *head;
char **HC;
printf("请输入赫夫曼树的节点个数\n");
scanf("%d",&n);
Huffman_Coding(n,head,HC);
printf("输出赫夫曼树的编码\n");
for(i=;i<=n;i++){
printf("%s\n",HC[i]);
}
return ;
}

测试结果:

二叉树的基本操作(含Huffman树)的更多相关文章

  1. 数据结构(三) 树和二叉树,以及Huffman树

    三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. ...

  2. 数据结构之Huffman树与最优二叉树

    最近在翻炒一些关于树的知识,发现一个比较有意思的二叉树,huffman树,对应到离散数学中的一种名为最优二叉树的路径结构,而Huffman的主要作用,最终可以归结到一种名为huffman编码的编码方式 ...

  3. 数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树

    树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和. n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+… 带权路径长度=根结点到任意结点的路径长度*该结点 ...

  4. Huffman树与最优二叉树续

    OK,昨天我们对huffman数的基本知识,以及huffman树的创建做了一些简介,http://www.cnblogs.com/Frank-C/p/5017430.html 今天接着聊: huffm ...

  5. 数据结构与算法(周鹏-未出版)-第六章 树-6.5 Huffman 树

    6.5 Huffman 树 Huffman 树又称最优树,可以用来构造最优编码,用于信息传输.数据压缩等方面,是一类有着广泛应用的二叉树. 6.5.1 二叉编码树 在计算机系统中,符号数据在处理之前首 ...

  6. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  7. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  8. 数据结构(二十七)Huffman树和Huffman编码

    Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树. 一.霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列. ...

  9. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)

    经过上面篇长篇大论的理论之后,在开始讲解Optaplanner相关基本概念及用法之前,我们先把他们提供的示例运行起来,好先让大家看看它是如何工作的.OptaPlanner的优点不仅仅是提供详细丰富的文 ...

  2. day-2 如何搭建一个github代码库

    最近在听尤瓦尔·赫拉利代写的两本书<人类简史>和<未来简史>两本书评,一部描述人类从哪里来,一部描述人类将往哪里去,书中阐述以前我们经历的饥饿.疾病和战争已经渐渐逝去,未来我们 ...

  3. C#中DBNull.Value和Null的用法和区别

    DBNull.Value,, 是适用于向数据库的表中插入空值.而 null,是指在程序中表示空引用. 或者对象为空.就是没有实例化. row[column]的值为DBNull.Value的话,至少说明 ...

  4. ArrayList、Vector、LinkedList、HashMap、HashTable的存储性能和特性

    ArrayList和Vector都是使用数组方式存储数据,次数组元素大于实际存储的数据以便添加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数 ...

  5. maven 每次update后影响接口实现类的问题

    遇到maven每次update后,就会更改eclipse中java Compiler中的jdk compliance版本 <plugin> <groupId>org.apach ...

  6. css(1-1)样式表

    CSS Id 和 Class id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器. id ...

  7. Python系列之 - 反射

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  8. C#使用Socket实现一个socket服务器与多个socket客户端通信

    在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发 ...

  9. POJ-1068 Parencodings---模拟括号的配对

    题目链接: https://vjudge.net/problem/POJ-1068 题目大意: 给出一种括号序列的表示形式名叫P序列,规则是统计出每个右括号之前的左括号个数作为序列每项的值.然后要求你 ...

  10. 浅析Java的Frok/Join框架

    一丶Fork/Join框架产生背景: 随着并发需求的不断提高和硬件的不断发展,程序并行执行仿佛就提上日程上来了,伟大的毛主席就说过:"人多力量大",所以如果一件事可以分配给多个人同 ...