zoukankan      html  css  js  c++  java
  • 将哈夫曼树转化成二叉树

                   今晚感觉好爽啊,好久好久没有这样的感觉。起床须要点爆发力。做事还须要点动力,给自己都没有下过这么大的决心写代码,帮她却写的非常好,我自己都惊讶了。哈哈哈。。

    。今晚也是帮她写好西邮导航睡不着。那就敲了一下哈夫曼树转化成二叉树的代码,事实上理解了真的不难。我定义F为一个二级指针,用它指向结点的地址,创建非常easy,输入数据data和权值weight,再把它的左右置为NULL;

                  初始化话完了,就開始创建二叉树吧。我定义两个变量s1和s2。s1永远标记的是F这个指针数组中节点权值最小的一个,s2则为次小,特别注意。s1和s2我每次初始化的时候都是放在F[i]!=NULL的结点上,这里用到了我前几次用的方法,利用for空语句循环找到s1和s2,对于怎样让找出s1最小s2次小我已经说过了,就再次不用说了。

                这里面的关键几步应该是怎样把二叉树建立起来,假如说我已经找到小小s1和次小s2了,以下用图好解释:

               

        

     

            创建出来就是这个样子了,经过一次创建成为以下这个样子,

          

          循环n-1次之后二叉树就创建成功了,直接进入代码;

    #include <iostream>
    
    #include<stdlib.h>
    
    #include<conio.h>
    
    #define null NULL
    
    
    typedef struct HuffNode{
    	char data;
    	int weight;
    	struct HuffNode *left,*right;
    }HuffNode;
    
    HuffNode *CreateHuffman(HuffNode **,int );
    void preorder(HuffNode * );
    void leafprint(HuffNode *);
    void Print(HuffNode *);
    
    HuffNode *CreateHuffman(HuffNode **F,int n){
        HuffNode *p;
        int i,j;
        int k1=0,k2=1;
        for(i=0;i<n-1;i++)
    	{
    	   for(k1=0;k1<n&&F[k1]==null;k1++);
    	  //	printf("数据%c,权值%d
    ",F[k1]->data,F[k1]->weight);
    	   for(k2=k1+1;k2<n&&F[k2]==null;k2++);
    	  //	printf("数据%c,权值%d
    ",F[k2]->data,F[k2]->weight);
    	   for(j=k2;j<n;j++)
    	   {
    	   	 if(F[j])
    	   	 {
    	   	    if(F[j]->weight<F[k1]->weight)
    			{
    	   	    	k2=k1;
    	   	    	k1=j;
    	   	    }	
    	   	    else if(F[j]->weight<F[k2]->weight&&F[k2])
    			{
    			    k2=j;   	
    			} 
    	   	 }
    	   }
    	   printf("输出最小k1=%d k2=%d
    ",k1,k2);
    	   
    	   p=(HuffNode *)malloc(sizeof(HuffNode));
    	   p->weight=F[k1]->weight+F[k2]->weight;
    	   p->data='w';
    	   p->left=F[k1];
    	   p->right=F[k2];
    	   F[k1]=p;
    	   F[k2]=null;
    	   
    	   
    	Print(F[k1]);
        }
    	return F[k1];		
    	
    }
    
    void Print(HuffNode *root){
    	
    	if(root)
    	{
    		printf("数据%c,权值%d
    ",root->data,root->weight);
    		Print(root->left);
    		Print(root->right);
    	}
    }
    
    void leafprint(HuffNode *root){
    	if(root)
    	{
    		if(root->left==NULL&&root->right==NULL)
    		  printf("数据%c。权值%d
    ",root->data,root->weight);
    		leafprint(root->left);
    		leafprint(root->right);
    	}
    	
    }
     int main(int argc, char** argv) {
        HuffNode **F;
        HuffNode *root;
        int n,i;
        printf("请你输入节点的个数: ");
        scanf("%d",&n);
        F=(HuffNode **)malloc(n*sizeof(HuffNode *));
        for(i=0;i<n;i++){
          fflush(stdin); 
          F[i]=(HuffNode *)malloc(sizeof(HuffNode));
          printf("
    输入第%d个节点的数据,权值: ",i+1);
          scanf("%c%d",&F[i]->data,&F[i]->weight);
          F[i]->left=F[i]->right=null;
          
        }
        root=CreateHuffman(F,n);    
        printf("
    先序遍历二叉树: 
    ");
        Print (root);
        printf("
    遍历叶子结点: 
    ");
        leafprint(root);
     return 0;
    }    

    对于怎样遍历二叉树先序。中序,后序都能够。任意执行结果

  • 相关阅读:
    QTreeWidget创建
    Qt QTreeWidget节点的添加+双击响应+删除详解(转)
    Qt QTreeWidget 树形结构实现(转)
    QMessageBox类学习:
    QAction类详解:
    Qt事件和信号的区别 .
    Qt消息机制和事件(二)
    Qt消息机制和事件(一)
    初步开始学习图
    图中最短路径算法(Dijkstra算法)(转)
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7402789.html
Copyright © 2011-2022 走看看