33,311
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
//
typedef struct Node{
int data;
Node *lchild;
Node *rchild;
}*Tree;
int num,n,s[1000],d[1000],wpl=0;
Node *a[1000];
void point(int m){
a[m-1] = (Node*)malloc(sizeof(Node));
a[m-1]->data = d[m-1];
if(m-1>0){
point(m-1);
}
}//创建节点,给其data赋值,并将节点存入a数组
void sort(){
Node *n;
for(int i=0;i<num-1;++i){
for(int j=i;j<num;++j){
if(a[i]->data<a[j]->data){
n=a[j]; a[j]=a[i]; a[i]=n;
}
}
}
}//选出最小的两个数字
void Build(){
Tree L = (Tree)malloc(sizeof(Tree));
Tree R = (Tree)malloc(sizeof(Tree));
Tree T = (Tree)malloc(sizeof(Tree));
sort();
T->data = a[num-1]->data + a[num-2]->data;
L = a[num-1];
R = a[num-2];
T->lchild = L;
T->rchild = R;
a[num-1] = 0;
--num;//合二元素为一,所以要减一
a[num-1]=T;
if(num>1){
Build();
}
}//构建哈夫曼树
int Deep(Node *T)
{
int deep=0;
if(T)
{
int leftdeep=0,rightdeep=0;
if(T->lchild != NULL && T->rchild != NULL){
leftdeep=Deep(T->lchild);
rightdeep=Deep(T->rchild);
deep=leftdeep>=rightdeep?leftdeep+1:deep=rightdeep+1;
}
}
return deep;
}
void Preorder(Node *T,int which,int n){
if(which == 0){
n = n*2;
}
if(which == 1){
n = n*2 + 1;
}
if(T->data != 0){
printf(" %d",T->data);
s[n-1] = T->data;//存入数组
if(T->lchild != NULL && T->rchild != NULL){
Preorder(T->lchild,0,n);
Preorder(T->rchild,1,n);
}
}
}
void InOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->lchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
printf(" %d",T->data);//输出
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->rchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
//到达最左,输出其及父节点值,再是其右节点(如果有),然后返回上一级
}
}
void PostOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
}
printf(" %d",T->data);
//输出完左返回上一级输出右然后再输出根
}
}
void space(int n){
for(int i=0;i<n;++i){
printf(" ");
}
}
int digit(int n){
int d=1,m=1;
while(d != 0){
d=n/int(pow(10,m))%10;
++m;
}
return m-1;//获得位数,即占位空间
}
void showTree(int deep,int layer){//深度,层编号(从树根开始依次增大)
int k = pow(2,layer-1);
int m = pow(2,layer);
printf("\n ");
//输出值
for(int i = k-1;i<m-1;++i){
space(pow(2,deep-layer));
s[i]==0 ? printf("*"):printf("%d",s[i]);
space(pow(2,deep-layer)-digit(s[i]));
if(i==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
if(layer<deep){
//换输出箭头
printf("\n ");
for(int j = k-1;j<m-1;++j){
space(pow(2,deep-layer));
s[j]==0 ? printf("/\\"):printf("/\\");
space(pow(2,deep-layer)-2);
if(j==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
//递归
showTree(deep,layer+1);
}
}
void WPL(int deep,int layer){//深度,层编号(从树根开始依次增大)
for(int i = pow(2,layer-1)-1;i<pow(2,layer)-1;++i){
for(int w=0;w<1000;++w){
if(d[w] == s[i] && d[w] != 0){
wpl=wpl+s[i]*(layer-1);
}
}
}
if(layer<=deep){
WPL(deep,layer+1);
}
}
int main(){
printf(" -------------------------------------------------------------------------\n|可视化哈夫曼树\n| ");
printf("\n|二叉树可视化注意事项");
printf("\n|以树根为第1层,数的深度为第n层");
printf("\n|1.建议输入最小两个数均不大于10");
printf("\n|2.由于控制台最大限制,节点超过13不显示二叉树结构!\n|3.二叉树生成可能有一定的变形");
printf("\n|4./\\指向左右子节点,*表示节点为空\n|5.当二叉树出现变形,可以4为参考判断节点从属关系");
printf("\n|\n|可能的运行错误警告\n|1.节点超过6,程序有几率崩溃,只能重新运行并输入,直到程序正常运行为止");
printf("\n|2.节点超过6,二叉树data有很小概率出错,重新运行即可");
printf("\n -------------------------------------------------------------------------\n");
printf(" 输入哈夫曼树节点个数(1<n<=1000):");
scanf("%d",&num);
if(num<2){
printf(" 输入不合法,节点数强制改为2!\n");num=2;
}
if(num>1000){
printf(" 输入不合法,节点数强制改为1000!\n");num=1000;
}
n=num;
for(int i=0;i<num;++i){
printf(" 第%d个节点:",i+1);
scanf("%d",&d[i]);
}
point(num);
Build();
printf(" 先序遍历:");
Preorder(a[0],2,1);
printf("\n 中序遍历:");
InOrder(a[0]);
printf("\n 后序遍历:");
PostOrder(a[0]);
WPL(Deep(a[0]),1);
printf("\n 带权路径长度:%d",wpl);
if(Deep(a[0])<8){
printf("\n\n 二叉树结构:*表示为空,/\\表示指向左右子节点\n");
showTree(Deep(a[0])+1,1);
}
if(Deep(a[0])>7){
printf("\n深度过大,无法正常显示!!");
}
}
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
//
typedef struct Node{
int data;
Node *lchild;
Node *rchild;
}*Tree;
int num,n,s[1000],d[1000],wpl=0;
Node *a[1000];
int mypow(int v,int e) {
if (e<=0) return 1;
if (e==1) return v;
int i,r;
r=1;
for (i=0;i<e;i++) r*=v;
return r;
}
void point(int m){
a[m-1] = (Node*)malloc(sizeof(Node));
a[m-1]->data = d[m-1];
a[m-1]->lchild=NULL;
a[m-1]->rchild=NULL;
if(m-1>0){
point(m-1);
}
}//创建节点,给其data赋值,并将节点存入a数组
void sort(){
Node *n;
for(int i=0;i<num-1;++i){
for(int j=i+1;j<num;++j){
if(a[i]->data<a[j]->data){
n=a[j]; a[j]=a[i]; a[i]=n;
}
}
}
}//选出最小的两个数字
void Build(){
Tree L = (Tree)malloc(sizeof(Tree));
Tree R = (Tree)malloc(sizeof(Tree));
Tree T = (Tree)malloc(sizeof(Node));
sort();
T->data = a[num-1]->data + a[num-2]->data;
L = a[num-1];
R = a[num-2];
T->lchild = L;
T->rchild = R;
a[num-1] = 0;
--num;//合二元素为一,所以要减一
a[num-1]=T;
if(num>1){
Build();
}
}//构建哈夫曼树
int Deep(Node *T)
{
int deep=0;
if(T)
{
int leftdeep=0,rightdeep=0;
if(T->lchild != NULL && T->rchild != NULL){
leftdeep=Deep(T->lchild);
rightdeep=Deep(T->rchild);
deep=leftdeep>=rightdeep?leftdeep+1:deep=rightdeep+1;
}
}
return deep;
}
void Preorder(Node *T,int which,int n){
if(which == 0){
n = n*2;
}
if(which == 1){
n = n*2 + 1;
}
if(T->data != 0){
printf(" %d",T->data);
s[n-1] = T->data;//存入数组
if(T->lchild != NULL && T->rchild != NULL){
Preorder(T->lchild,0,n);
Preorder(T->rchild,1,n);
}
}
}
void InOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->lchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
printf(" %d",T->data);//输出
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->rchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
//到达最左,输出其及父节点值,再是其右节点(如果有),然后返回上一级
}
}
void PostOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
}
printf(" %d",T->data);
//输出完左返回上一级输出右然后再输出根
}
}
void space(int n){
for(int i=0;i<n;++i){
printf(" ");
}
}
int digit(int n){
int d=1,m=1;
while(d != 0){
d=n/int(mypow(10,m))%10;
++m;
}
return m-1;//获得位数,即占位空间
}
void showTree(int deep,int layer){//深度,层编号(从树根开始依次增大)
int k = mypow(2,layer-1);
int m = mypow(2,layer);
printf("\n ");
//输出值
for(int i = k-1;i<m-1;++i){
space(mypow(2,deep-layer));
s[i]==0 ? printf("*"):printf("%d",s[i]);
space(mypow(2,deep-layer)-digit(s[i]));
if(i==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
if(layer<deep){
//换输出箭头
printf("\n ");
for(int j = k-1;j<m-1;++j){
space(mypow(2,deep-layer));
s[j]==0 ? printf("/\\"):printf("/\\");
space(mypow(2,deep-layer)-2);
if(j==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
//递归
showTree(deep,layer+1);
}
}
void WPL(int deep,int layer){//深度,层编号(从树根开始依次增大)
for(int i = mypow(2,layer-1)-1;i<mypow(2,layer)-1;++i){
for(int w=0;w<1000;++w){
if(d[w] == s[i] && d[w] != 0){
wpl=wpl+s[i]*(layer-1);
}
}
}
if(layer<=deep){
WPL(deep,layer+1);
}
}
int main(){
printf(" -------------------------------------------------------------------------\n|可视化哈夫曼树\n| ");
printf("\n|二叉树可视化注意事项");
printf("\n|以树根为第1层,数的深度为第n层");
printf("\n|1.建议输入最小两个数均不大于10");
printf("\n|2.由于控制台最大限制,节点超过13不显示二叉树结构!\n|3.二叉树生成可能有一定的变形");
printf("\n|4./\\指向左右子节点,*表示节点为空\n|5.当二叉树出现变形,可以4为参考判断节点从属关系");
printf("\n -------------------------------------------------------------------------\n");
printf(" 输入哈夫曼树节点个数(1<n<=1000):");
scanf("%d",&num);
if(num<2){
printf(" 输入不合法,节点数强制改为2!\n");num=2;
}
if(num>1000){
printf(" 输入不合法,节点数强制改为1000!\n");num=1000;
}
n=num;
for(int i=0;i<num;++i){
printf(" 第%d个节点:",i+1);
scanf("%d",&d[i]);
}
point(num);
Build();
printf("\n先序遍历:");
Preorder(a[0],2,1);
printf("\n 中序遍历:");
InOrder(a[0]);
printf("\n 后序遍历:");
PostOrder(a[0]);
WPL(Deep(a[0]),1);
printf("\n 带权路径长度:%d",wpl);
if(Deep(a[0])<8){
printf("\n\n 二叉树结构:*表示为空,/\\表示指向左右子节点\n");
showTree(Deep(a[0])+1,1);
}
if(Deep(a[0])>7){
printf("\n深度过大,无法正常显示!!");
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>
//
typedef struct Node{
int data;
Node *lchild;
Node *rchild;
}*Tree;
int num,n,s[1000],d[1000],wpl=0;
Node *a[1000];
int mypow(int v,int e) {
if (e<=0) return 1;
if (e==1) return v;
int i,r;
r=1;
for (i=0;i<e;i++) r*=v;
return r;
}
void point(int m){
a[m-1] = (Node*)malloc(sizeof(Node));
a[m-1]->data = d[m-1];
a[m-1]->lchild=NULL;
a[m-1]->rchild=NULL;
if(m-1>0){
point(m-1);
}
}//创建节点,给其data赋值,并将节点存入a数组
void sort(){
Node *n;
for(int i=0;i<num-1;++i){
for(int j=i;j<num;++j){
if(a[i]->data<a[j]->data){
n=a[j]; a[j]=a[i]; a[i]=n;
}
}
}
}//选出最小的两个数字
void Build(){
Tree L = (Tree)malloc(sizeof(Tree));
Tree R = (Tree)malloc(sizeof(Tree));
Tree T = (Tree)malloc(sizeof(Tree));
sort();
T->data = a[num-1]->data + a[num-2]->data;
L = a[num-1];
R = a[num-2];
T->lchild = L;
T->rchild = R;
a[num-1] = 0;
--num;//合二元素为一,所以要减一
a[num-1]=T;
if(num>1){
Build();
}
}//构建哈夫曼树
int Deep(Node *T)
{
int deep=0;
if(T)
{
int leftdeep=0,rightdeep=0;
if(T->lchild != NULL && T->rchild != NULL){
leftdeep=Deep(T->lchild);
rightdeep=Deep(T->rchild);
deep=leftdeep>=rightdeep?leftdeep+1:deep=rightdeep+1;
}
}
return deep;
}
void Preorder(Node *T,int which,int n){
if(which == 0){
n = n*2;
}
if(which == 1){
n = n*2 + 1;
}
if(T->data != 0){
printf(" %d",T->data);
s[n-1] = T->data;//存入数组
if(T->lchild != NULL && T->rchild != NULL){
Preorder(T->lchild,0,n);
Preorder(T->rchild,1,n);
}
}
}
void InOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->lchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
printf(" %d",T->data);//输出
if(T->lchild != NULL && T->rchild != NULL){
InOrder(T->rchild);//先遍历,到达二叉树最左 (该节点没有左子,否则不是二叉树最左)
}
//到达最左,输出其及父节点值,再是其右节点(如果有),然后返回上一级
}
}
void PostOrder(Node *T){
if(T == NULL){
return;
}
if(T != NULL){
if(T->lchild != NULL && T->rchild != NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
}
printf(" %d",T->data);
//输出完左返回上一级输出右然后再输出根
}
}
void space(int n){
for(int i=0;i<n;++i){
printf(" ");
}
}
int digit(int n){
int d=1,m=1;
while(d != 0){
d=n/int(mypow(10,m))%10;
++m;
}
return m-1;//获得位数,即占位空间
}
void showTree(int deep,int layer){//深度,层编号(从树根开始依次增大)
int k = mypow(2,layer-1);
int m = mypow(2,layer);
printf("\n ");
//输出值
for(int i = k-1;i<m-1;++i){
space(mypow(2,deep-layer));
s[i]==0 ? printf("*"):printf("%d",s[i]);
space(mypow(2,deep-layer)-digit(s[i]));
if(i==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
if(layer<deep){
//换输出箭头
printf("\n ");
for(int j = k-1;j<m-1;++j){
space(mypow(2,deep-layer));
s[j]==0 ? printf("/\\"):printf("/\\");
space(mypow(2,deep-layer)-2);
if(j==(k+m-3)/2){space(1);}//如果处于该层中间,还要多输出一个空格
}
//递归
showTree(deep,layer+1);
}
}
void WPL(int deep,int layer){//深度,层编号(从树根开始依次增大)
for(int i = mypow(2,layer-1)-1;i<mypow(2,layer)-1;++i){
for(int w=0;w<1000;++w){
if(d[w] == s[i] && d[w] != 0){
wpl=wpl+s[i]*(layer-1);
}
}
}
if(layer<=deep){
WPL(deep,layer+1);
}
}
int main(){
printf(" -------------------------------------------------------------------------\n|可视化哈夫曼树\n| ");
printf("\n|二叉树可视化注意事项");
printf("\n|以树根为第1层,数的深度为第n层");
printf("\n|1.建议输入最小两个数均不大于10");
printf("\n|2.由于控制台最大限制,节点超过13不显示二叉树结构!\n|3.二叉树生成可能有一定的变形");
printf("\n|4./\\指向左右子节点,*表示节点为空\n|5.当二叉树出现变形,可以4为参考判断节点从属关系");
printf("\n -------------------------------------------------------------------------\n");
printf(" 输入哈夫曼树节点个数(1<n<=1000):");
scanf("%d",&num);
if(num<2){
printf(" 输入不合法,节点数强制改为2!\n");num=2;
}
if(num>1000){
printf(" 输入不合法,节点数强制改为1000!\n");num=1000;
}
n=num;
for(int i=0;i<num;++i){
printf(" 第%d个节点:",i+1);
scanf("%d",&d[i]);
}
point(num);
Build();
printf(" 先序遍历:");
Preorder(a[0],2,1);
printf("\n 中序遍历:");
InOrder(a[0]);
printf("\n 后序遍历:");
PostOrder(a[0]);
WPL(Deep(a[0]),1);
printf("\n 带权路径长度:%d",wpl);
if(Deep(a[0])<8){
printf("\n\n 二叉树结构:*表示为空,/\\表示指向左右子节点\n");
showTree(Deep(a[0])+1,1);
}
if(Deep(a[0])>7){
printf("\n深度过大,无法正常显示!!");
}
return 0;
}
// -------------------------------------------------------------------------
//|可视化哈夫曼树
//|
//|二叉树可视化注意事项
//|以树根为第1层,数的深度为第n层
//|1.建议输入最小两个数均不大于10
//|2.由于控制台最大限制,节点超过13不显示二叉树结构!
//|3.二叉树生成可能有一定的变形
//|4./\指向左右子节点,*表示节点为空
//|5.当二叉树出现变形,可以4为参考判断节点从属关系
// -------------------------------------------------------------------------
// 输入哈夫曼树节点个数(1<n<=1000):8
// 第1个节点:2
// 第2个节点:22
// 第3个节点:6
// 第4个节点:20
// 第5个节点:3
// 第6个节点:10
// 第7个节点:7
// 第8个节点:30
// 先序遍历: 100 42 20 22 58 28 11 5 2 3 6 17 7 10 30
// 中序遍历: 20 42 22 100 2 5 3 11 6 28 7 17 10 58 30
// 后序遍历: 20 22 42 2 3 5 6 11 7 10 17 28 30 58 100
// 带权路径长度:261
//
// 二叉树结构:*表示为空,/\表示指向左右子节点
//
// 100
// /\
// 42 58
// /\ /\
// 20 22 28 30
// /\ /\ /\ /\
// * * * * 11 17 * *
// /\ /\ /\ /\ /\ /\ /\ /\
// * * * * * * * * 5 6 7 10 * * * *
// /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\
// * * * * * * * * * * * * * * * * 2 3 * * * * * * * * * * * * * *
//
#include <iostream>
#include <string>
using namespace std;
struct huffTree {
int parent;
int lchild;
int rchild;
int weight;
string flag;
};
struct Lowest_node {
char ch;
int ch_num;
};
void coding(int length,huffTree *tree,int n,int &a,int &b) {
int i;
int r,s;
r=s=length;
for (i=0;i<n;i++) {
if (tree[i].weight<r
&& tree[i].parent==-1) {
r=tree[i].weight;
a=i;
}
}
for (i=0;i<n;i++) {
if (tree[i].weight<s
&& i!=a
&& tree[i].parent==-1) {
s=tree[i].weight;
b=i;
}
}
}
void frequency(string str) {
int i,j;
int length=str.length();
Lowest_node *node=new Lowest_node[length];
for (i=0;i<length;i++) node[i].ch_num=0;
int char_type_num=0;
for (i=0;i<length;i++) {
for (j=0;j<char_type_num;j++)
if (str[i]==node[j].ch
|| ('a'<=node[j].ch && node[j].ch<='z'
&& str[i]+32==node[j].ch))
break;//
if (j<char_type_num) node[j].ch_num++;
else {
if ('A'<=str[i] && str[i] <= 'Z') node[j].ch=str[i]+32;
else node[j].ch=str[i];
node[j].ch_num++;
char_type_num++;
}
}
for (i=0;i<char_type_num;i++) {
for (j=i;j<char_type_num;j++) {
if (node[j].ch_num<node[j+1].ch_num) {
int temp;
char ch_temp;
temp=node[j].ch_num;
ch_temp=node[j].ch;
node[j].ch_num=node[j+1].ch_num;
node[j].ch=node[j+1].ch;
node[j+1].ch_num=temp;
node[j+1].ch=ch_temp;
}
}
}
for (i=0;i<char_type_num;i++)
cout<<"字符"<<node[i].ch<<"出现了"<<node[i].ch_num<<"次"<<endl;
huffTree *huff=new huffTree[2*char_type_num-1];
huffTree temp;
string *code=new string[2*char_type_num-1];
for (i=0;i<2*char_type_num-1;i++) {
huff[i].lchild=-1;
huff[i].parent=-1;
huff[i].rchild=-1;
huff[i].flag=-1;
}
for (j=0;j<char_type_num;j++) huff[j].weight=node[j].ch_num;
int min1,min2;
for (int k=char_type_num;k<2*char_type_num-1;k++) {
coding(length,huff,k,min1,min2);
huff[min1].parent=k;
huff[min2].parent=k;
huff[min1].flag="0";
huff[min2].flag="1";
huff[k].lchild=min1;
huff[k].rchild=min2;
huff[k].weight=huff[min1].weight+huff[min2].weight;
}
for (i=0;i<char_type_num;i++) {
temp=huff[i];
while (1) {
code[i]=temp.flag+code[i];
temp=huff[temp.parent];
if (temp.parent==-1) break;//
}
}
cout<<"字符串的每个字符huffman编码为:"<<endl;
for (i=0;i<char_type_num;i++) cout<<node[i].ch<<" "<<code[i]<<endl;
cout<<"整个字符串的huffman编码为:"<<endl;
for (i=0;i<length;i++) { //S?
for (j=0;j<char_type_num;j++) {
if (str[i]==node[j].ch)
cout<<code[j];
}
}
delete[] node;
node=NULL;
delete[] huff;
huff=NULL;
delete[] code;
code=NULL;
}
int main() {
int length=0;
string str;
cout<<"请输入一个字符串:";
cin>>str;
frequency(str);
return 0;
}
//请输入一个字符串:2333abcde
//字符3出现了3次
//字符2出现了1次
//字符a出现了1次
//字符b出现了1次
//字符c出现了1次
//字符d出现了1次
//字符e出现了1次
//字符串的每个字符huffman编码为:
//3 11
//2 000
//a 001
//b 010
//c 011
//d 100
//e 101
//整个字符串的huffman编码为:
//000111111001010011100101
[quote=引用 15 楼 Chen8013 的回复:] [quote=引用 14 楼 zhao4zhong1 的回复:] Orz 跪谢楼上帮断帖之恩当涌泉相报!#include<stdio.h> #include<stdlib.h> #include<math.h> #include<malloc.h> // // . . . . . . . .
[quote=引用 15 楼 Chen8013 的回复:] [quote=引用 14 楼 zhao4zhong1 的回复:] Orz 跪谢楼上帮断帖之恩当涌泉相报!#include<stdio.h> #include<stdlib.h> #include<math.h> #include<malloc.h> // // . . . . . . . .