树——数据结构


二叉树的链式储存及其操作,Huffman树及Huffman编码;


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Node  //二叉树的链式储存方式;
{
    char data;
    struct Node*LChild;
    struct Node*RChild;
} BitNode,*BiTree;

void Init(BiTree *b)  //初始化;
{
    *b=(BiTree)malloc(sizeof(BitNode));
    (*b)->LChild=NULL;
    (*b)->RChild=NULL;
}

void PreOrder(BiTree root)  //先序遍历二叉树;
{
    if(root!=NULL)
    {
        printf("%c ",root->data);
        PreOrder(root->LChild);
        PreOrder(root->RChild);
    }
}

void InOrder(BiTree root)  //中序遍历二叉树;
{
    if(root!=NULL)
    {
        InOrder(root->LChild);
        printf("%c ",root->data);
        InOrder(root->RChild);
    }
}

void PostOrder(BiTree root)  //后序遍历二叉树;
{
    if(root!=NULL)
    {
        PostOrder(root->LChild);
        PostOrder(root->RChild);
        printf("%c ",root->data);
    }
}

void CreateBiTree(BiTree *bt)  //建立二叉树;
{
    char ch;
    ch=getchar();
    if(ch=='.') *bt=NULL;
    else
    {
        *bt=(BiTree)malloc(sizeof(BitNode));
        (*bt)->data=ch;
        CreateBiTree(&((*bt)->LChild));
        CreateBiTree(&((*bt)->RChild));
    }
}

typedef struct
{
    BiTree elem[50];
    int top;
} SeqStack;

void InitStack(SeqStack *S)
{
    S->top=-1;
}

void Push(SeqStack *s,BiTree x)
{
    if(s->top==49) return;
    s->top++;
    s->elem[s->top]=x;
}

void Pop(SeqStack *s,BiTree *x)
{
    if(s->top==-1) return;
    else
    {
        *x=s->elem[s->top];
        s->top--;
    }
}

void LayerOrder(BiTree bt)  //广搜;
{
    SeqStack Q;
    InitStack(&Q);
    BiTree p;
    if(bt==NULL) return;
    Push(&Q,bt);
    while(Q.top!=-1)
    {
        Pop(&Q,&p);
        printf("%c ",p->data);
        if(p->LChild) Push(&Q,p->LChild);
        if(p->RChild) Push(&Q,p->RChild);
    }
}

typedef struct  //Huffman树;
{
    int weight;
    int parent;
    int LChild;
    int RChild;
} HTNode,HuffmanTree[100];

void select(HuffmanTree ht,int n,int *s1,int *s2)  //提取最小两个值;
{
    *s1=0;
    *s2=0;
    for(int i=1; i<=n; i++)
    {
        if(ht[i].parent==0)
        {
            if(ht[*s1].weight>ht[i].weight) *s1=i;
            if(ht[*s1].weight<ht[*s2].weight)
            {
                int t=*s1;
                *s1=*s2;
                *s2=t;
            }
        }
    }
}
void CrtHuffmanTree(HuffmanTree ht,int w[],int n)  //建立Huffman树;
{
    for(int i=1; i<=n; i++)
    {
        ht[i].weight=w[i];
        ht[i].LChild=ht[i].parent=ht[i].RChild=0;
    }
    int m=2*n-1;
    for(int i=n+1; i<=m; i++) ht[i].LChild=ht[i].parent=ht[i].RChild=ht[i].weight=0;
    for(int i=n+1; i<=m; i++)
    {
        int s1,s2;
        select(ht,i-1,&s1,&s2);
        ht[i].weight=ht[s1].weight+ht[s2].weight;
        ht[s1].parent=i;
        ht[s2].parent=i;
        ht[i].LChild=s1;
        ht[i].RChild=s2;
    }
}

typedef char * HuffmanCode[100];
void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n)  //求Huffman编码;
{
    char *cd;
    int start,c,p;
    cd=(char*)malloc(n*sizeof(char));
    cd[n-1]='\0';
    for(int i=1; i<=n; i++)
    {
        start=n-1;
        c=i;
        p=ht[i].parent;
        while(p!=0)
        {
            --start;
            if(ht[p].LChild==c) cd[start]='0';
            else cd[start]='1';
            c=p;
            p=ht[p].parent;
        }
        hc[i]=(char*)malloc((n-start)*sizeof(char));
        strcpy(hc[i],&cd[start]);
    }
    free(cd);
}


int LeafCount=0;
void leaf(BiTree root)  //求叶子节点;
{
    if(root!=NULL)
    {
        leaf(root->LChild);
        leaf(root->RChild);
        if(root->LChild==NULL&&root->RChild==NULL) LeafCount++;
    }
}

int depth=0;
void PreTreeDepth(BiTree bt,int h)  //求深度;
{
    if(bt!=NULL)
    {
        if(h>depth) depth=h;
        PreTreeDepth(bt->LChild,h+1);
        PreTreeDepth(bt->RChild,h+1);
    }
}

int main()
{
    BiTree b1;
    Init(&b1);
    CreateBiTree(&b1);
    PreOrder(b1);
    printf("\n");
    InOrder(b1);
    printf("\n");
    PostOrder(b1);
    printf("\n");
    LeafCount=0;
    leaf(b1);
    printf("%d\n",LeafCount);
    PreTreeDepth(b1,0);
    printf("%d\n",depth);
    LayerOrder(b1);
    printf("\n");
    HuffmanTree ht;
    int w[11]= {0,1,2,3,4,5,6,7,8,9,10};
    ht[0].weight=0x3f3f3f3f;
    CrtHuffmanTree(ht,w,10);
    for(int i=11; i<=19; i++) printf("%d ",ht[i].weight);
    printf("\n");
    HuffmanCode hc;
    CrtHuffmanCode(ht,hc,10);
    for(int i=1; i<=10; i++) printf("%s ",hc[i]);
    printf("\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值