回 帖 发 新 帖 刷新版面

主题:求助郝夫曼编码算法(程序里就一部分写的不好)

//--------------------------part 1
#include "stdafx.h"
# include <stdio.h>
# include <malloc.h>
#include <string.h>
# define    ERROR          -1
# define    OK             1
//--------以下用户按照具体问题设定--------------------
 typedef char TElemType;  //指定char为二叉树结点元素类型

 void visit (char e)
  {   printf ("---%c---\n",e);  }
//----------------------------------------------------

//-----------以下实现二叉树二叉链表的几个基本操作------------
typedef struct BiTNode {
     TElemType  data;
     struct BiTNode  *lchild,*rchild;
  }BiTNode, *BiTree;
typedef struct {  char  *ch;
                  int length;
                }  HString;
void CreateBiTree(BiTree &T)
{  char ch;
   scanf  ("%c",&ch);
   if  (ch=='#')  T=NULL;
   else  {
        T=new BiTNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
          };


void CountLeaf1 (BiTree T,int & count)
{  if (T) {  
    if ((!T->lchild)&&(!T->rchild))  count++;
    CountLeaf1 (T->lchild,count);
    CountLeaf1 (T->rchild,count);
          };
}

int CountLeaf2 (BiTree T)
{
   if (!T) return 0;
   if ((!T->lchild)&&(!T->rchild)) return 1;
   return  CountLeaf2(T->lchild)+CountLeaf2(T->rchild);
}

void CountNode (BiTree T,int & count)
{
   if (T!=NULL)
   {
      count++;
      CountNode (T->lchild,count);
      CountNode (T->rchild,count);
   };
}

int CountDepth (BiTree T)
{  
    int templ,tempr;

    if (!T) return 0; 
    else {  templ=CountDepth(T->lchild);
            tempr=CountDepth(T->rchild);
           return (templ>=tempr)?templ+1:tempr+1;
          };
}

int PreOrderTraverse (BiTree T, void (*visit)(TElemType e))
   {  if (T) {  visit (T->data);
              PreOrderTraverse  (T->lchild, visit);
              PreOrderTraverse  (T->rchild, visit);
                };
      return OK;
    }

int InOrderTraverse (BiTree T, void (*visit)(TElemType e))
   {  if (T) { InOrderTraverse  (T->lchild, visit);
               visit (T->data);              
               InOrderTraverse  (T->rchild, visit);
                };
      return OK;
    }

int PostOrderTraverse (BiTree T, void (*visit)(TElemType e))
   {  if (T) { PostOrderTraverse  (T->lchild, visit);
               PostOrderTraverse  (T->rchild, visit);
               visit (T->data);               
              };
      return OK;
    }

int IsFullTree(BiTree T)//判断是否是满二叉树
{
    int i=CountDepth (T);
    int j=CountLeaf2 (T);
    if(j==i*i-1)return OK;
    else return ERROR;
}

回复列表 (共1个回复)

沙发

//输出叶子结点方法1:
//void ShowLeaf(BiTree T,void (*visit)(TElemType e))//如果是满二叉树,比如这里输入为ab##c##那么输出应该是bc
//{
//    if(T)
//    {
//        if((T->lchild==NULL)&&(T->rchild==NULL))
//        {
//            visit(T->data);
//        }
//        ShowLeaf(T->lchild,visit);
//        ShowLeaf(T->rchild,visit);
//    };
//}
//输出叶子结点方法2:
void ShowLeaf(BiTree T,int i,char * &sleaf)//如果是满二叉树,比如这里输入为ab##c##那么输出应该是bc
{
    if(T)
    {
        if((T->lchild==NULL)&&(T->rchild==NULL))
        {
            sleaf[i]=T->data;
            i++;
        }
        ShowLeaf(T->lchild,i++,sleaf);
        ShowLeaf(T->rchild,i++,sleaf);
    };
}

void HFcode(BiTree T,char Leaf)//将Leaf这个叶子结点进行处理,输出它的郝夫曼编码
{
    //[size=3][color=red]就这部分写的不好,帮帮,耽误大家一会儿工夫啦:)[/color][/size]
}
int main(int argc, char* argv[])
{
    BiTree T;

    int count_Node,count_Leaf;
    count_Node=0; count_Leaf=0;
    int i=0;
    HString Leaf;

    printf ("请输入二叉树的先序遍历序列(包括空子树#符号)\n");
    CreateBiTree (T);
    printf ("二叉树建立完毕\n");

    printf ("以下是先序遍历序列\n");
    PreOrderTraverse  (T,visit);

    printf ("以下是中序遍历序列\n");
    InOrderTraverse  (T,visit);

    printf ("以下是后序遍历序列\n");
    PostOrderTraverse  (T,visit);

    printf ("以下计算节点数目\n");
    CountNode  (T,count_Node);
    printf ("%d\n",count_Node);
    
    printf ("以下计算叶子节点数目(方法1)\n");
    CountLeaf1  (T,count_Leaf);
    printf ("%d\n",count_Leaf);

    printf ("以下计算叶子节点数目(方法2)\n");
    printf ("%d\n",CountLeaf2(T));

    printf ("以下计算二叉树的深度\n");
    printf ("%d\n",CountDepth(T));
    
    if(IsFullTree(T))printf("它是一棵满二叉树\n");
    else printf("它不是一棵满二叉树\n");

    printf("以下输出二叉树的叶子结点:\n");
    Leaf.length=count_Leaf;
    Leaf.ch=(char *)malloc(count_Leaf*sizeof(char));
    ShowLeaf(T,i,Leaf.ch);
    for(i=0;i<count_Leaf;i++)
    {
        visit(Leaf.ch[i]);
    }
    printf("以下输入每个叶子结点的郝夫曼编码:\n");
    for(i=0;i<count_Leaf;i++)
    {
        printf("\"%c\"的郝夫曼编码为-----",Leaf.ch[i]);
        HFcode(T,Leaf.ch[i]);
        printf("\n");
    }
    return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册