第十週 【專案1
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
int ltag,rtag; //增加的線索標記
struct node *lchild;
struct node *rchild;
} TBTNode;
void CreateTBTNode(TBTNode * &b,char *str)
{
TBTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; //建立的二叉樹初始時為空
ch=str[j];
while (ch!='\0') //str未掃描完時迴圈
{
switch(ch)
{
case '(':
top++;
St[top]=p;
k=1;
break; //為左結點
case ')':
top--;
break ;
case ',':
k=2;
break; //為右結點
default:
p=(TBTNode *)malloc(sizeof(TBTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if (b==NULL) //*p為二叉樹的根結點
b=p;
else //已建立二叉樹根結點
{
switch(k)
{
case 1:
St[top]->lchild=p;
break;
case 2:
St[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
}
}
void DispTBTNode(TBTNode *b)
{
if (b!=NULL)
{
printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispTBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
DispTBTNode(b->rchild);
printf(")");
}
}
}
TBTNode *pre; //全域性變數
void Thread(TBTNode *&p)
{
if (p!=NULL)
{
Thread(p->lchild); //左子樹線索化
if (p->lchild==NULL) //前驅線索
{
p->lchild=pre; //建立當前結點的前驅線索
p->ltag=1;
}
else p->ltag=0;
if (pre->rchild==NULL) //後繼線索
{
pre->rchild=p; //建立前驅結點的後繼線索
pre->rtag=1;
}
else pre->rtag=0;
pre=p;
Thread(p->rchild); //右子樹線索化
}
}
TBTNode *CreaThread(TBTNode *b) //中序線索化二叉樹
{
TBTNode *root;
root=(TBTNode *)malloc(sizeof(TBTNode)); //建立根結點
root->ltag=0;
root->rtag=1;
root->rchild=b;
if (b==NULL) //空二叉樹
root->lchild=root;
else
{
root->lchild=b;
pre=root; //pre是*p的前驅結點,供加線索用
Thread(b); //中序遍歷線索化二叉樹
pre->rchild=root; //最後處理,加入指向根結點的線索
pre->rtag=1;
root->rchild=pre; //根結點右線索化
}
return root;
}
void ThInOrder(TBTNode *tb)
{
TBTNode *p=tb->lchild; //指向根結點
while (p!=tb)
{
while (p->ltag==0) p=p->lchild;
printf("%c ",p->data);
while (p->rtag==1 && p->rchild!=tb)
{
p=p->rchild;
printf("%c ",p->data);
}
p=p->rchild;
}
}
int main()
{
TBTNode *b,*tb;
CreateTBTNode(b,"A(B(D(,G)),C(E,F))");
printf(" 二叉樹:");
DispTBTNode(b);
printf("\n");
tb=CreaThread(b);
printf(" 線索中序序列:");
ThInOrder(tb);
printf("\n");
return 0;
}
哈夫曼樹
#include <stdio.h>
#include <string.h>
#define N 50 //葉子結點數
#define M 2*N-1 //樹中結點總數
//哈夫曼樹的節點結構型別
typedef struct
{
char data; //結點值
double weight; //權重
int parent; //雙親結點
int lchild; //左孩子結點
int rchild; //右孩子結點
} HTNode;
//每個節點哈夫曼編碼的結構型別
typedef struct
{
char cd[N]; //存放哈夫曼碼
int start;
} HCode;
//構造哈夫曼樹
void CreateHT(HTNode ht[],int n)
{
int i,k,lnode,rnode;
double min1,min2;
for (i=0; i<2*n-1; i++) //所有結點的相關域置初值-1
ht[i].parent=ht[i].lchild=ht[i].rchild=-1;
for (i=n; i<2*n-1; i++) //構造哈夫曼樹
{
min1=min2=32767; //lnode和rnode為最小權重的兩個結點位置
lnode=rnode=-1;
for (k=0; k<=i-1; k++)
if (ht[k].parent==-1) //只在尚未構造二叉樹的結點中查詢
{
if (ht[k].weight<min1)
{
min2=min1;
rnode=lnode;
min1=ht[k].weight;
lnode=k;
}
else if (ht[k].weight<min2)
{
min2=ht[k].weight;
rnode=k;
}
}
ht[i].weight=ht[lnode].weight+ht[rnode].weight;
ht[i].lchild=lnode;
ht[i].rchild=rnode;
ht[lnode].parent=i;
ht[rnode].parent=i;
}
}
//實現哈夫曼編碼
void CreateHCode(HTNode ht[],HCode hcd[],int n)
{
int i,f,c;
HCode hc;
for (i=0; i<n; i++) //根據哈夫曼樹求哈夫曼編碼
{
hc.start=n;
c=i;
f=ht[i].parent;
while (f!=-1) //循序直到樹根結點
{
if (ht[f].lchild==c) //處理左孩子結點
hc.cd[hc.start--]='0';
else //處理右孩子結點
hc.cd[hc.start--]='1';
c=f;
f=ht[f].parent;
}
hc.start++; //start指向哈夫曼編碼最開始字元
hcd[i]=hc;
}
}
//輸出哈夫曼編碼
void DispHCode(HTNode ht[],HCode hcd[],int n)
{
int i,k;
double sum=0,m=0;
int j;
printf(" 輸出哈夫曼編碼:\n"); //輸出哈夫曼編碼
for (i=0; i<n; i++)
{
j=0;
printf(" %c:\t",ht[i].data);
for (k=hcd[i].start; k<=n; k++)
{
printf("%c",hcd[i].cd[k]);
j++;
}
m+=ht[i].weight;
sum+=ht[i].weight*j;
printf("\n");
}
printf("\n 平均長度=%g\n",1.0*sum/m);
}
int main()
{
int n=8,i; //n表示初始字串的個數
char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1};
HTNode ht[M];
HCode hcd[N];
for (i=0; i<n; i++)
{
ht[i].data=str[i];
ht[i].weight=fnum[i];
}
printf("\n");
CreateHT(ht,n);
CreateHCode(ht,hcd,n);
DispHCode(ht,hcd,n);
printf("\n");
return 0;
}
相關推薦
第十週【專案1
#include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; int ltag,rtag;
第十週 【專案1
#include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; int ltag,
資料結構第三週 【專案1
問題及程式碼: /* *(1)目的是要測試“建立線性表”的演算法CreateList,為檢視建表的結果,需要實現“輸出線性表”的演算法DispList。在研習DispList中發現,要輸出線性表,還要判斷表是否為空,這樣,實現判斷線性表是否為空的演算法ListEmpty成為
第十四周 【專案1
#include <stdio.h> #define MaxSize 100 //定義最大雜湊表長度 #define NULLKEY -1 //定義空關鍵字值 #define DELKEY -2 //定
第十四周【專案1
Copyright(c) 2017,煙臺大學計算機與控制工程學院 All rights reserved. 檔名稱:text.cpp 作者:黃瀟慧 完成日期:2017年12月5日 版本:vc6.0 問題描述: 認真閱讀並驗證雜湊表實施查詢
第十四周 【專案1-動物這樣叫】下面是給出的基類Animal宣告和main()函式。
#include <iostream> #include <string> using namespace std; class Animal { public: virtual void cry() { cout<&l
第三週【專案1
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reserved. *檔名稱: *作 者:李佳駿 *完成日期:2017年9月20日 *版 本 號:v1.0 *問題描述:實現有關線性表的各種
第十一週 【專案1-圖基本演算法庫】
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年11月09日 *版本號:v1.0 *問題描述:圖
第十週web作業1
for each in: 使用一個變數迭代一個物件的所有屬性值,對於每一個屬性值,有一個指定的語句塊被執行. 語法: 1 for each (variable in object) { 2 statement 3 } 引數: variable:
第八週 【專案4-字串加密】
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年12月14日 *版本號:v1.0 *問題描述: 一個文
第八週 【專案3-順序串演算法】
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年1
第三週 【專案3
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年11月09日 *版本號:v1.0 *問題描述:
第八週 【專案2
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年12月14日 *版本號:v1.0 *問題描述: 定義鏈串的
第三週實踐專案1--順序表的基本運算(3)插入.刪除資料,初始化.銷燬線性表
問題: /* Copyright (c)2015,煙臺大學計算機與控制工程學院 All rights reserved. 檔名稱:專案1--順序表的基本運算(3)插入.刪除資料,初始化.銷燬線性表.cpp
C++第十週【任務2】定義一個名為CPerson的類,有以下私有成員:姓名、身份證號、性別和年齡,成員函式:建構函式、解構函式、輸出資訊的函式。
/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: C++第十週【任務2】 * 作
第12周 【專案1
問題描述: 分別定義Teacher(教師)類和Cadre(幹部)類,採用多重繼承方式由這兩個類派生出新類Teacher_Cadre(教師兼幹部)。要求: (1)在兩個基類中都包含姓名、年齡、性別、地址、電話等資料成員。 (2)在Teacher類中還包含資料成員title
【第十週專案1】二叉樹演算法驗證(一)
/* Copyright (c)2017,煙臺大學計算機與控制工程學院 All rights reserved. 檔名稱:33.cpp 作 者:尚文哲 完成日期:2017年11月9日 問題描述: 執行並重複測試教學內容中涉及的演算法。改
第十一週 【專案2-操作用鄰接表儲存的圖】
/* *Copyright (c)2017,煙臺大學計算機與控制工程學院 *All rights reservrd. *作者:趙楷文 *完成時間:2017年11月09日 *版本號:v1.0 *問題描述:假
第十週 專案1
(1)層次遍歷演算法的驗證 #include <stdio.h>#include "btree.h"void LevelOrder(BTNode *b) { BTNode *p; BTNode *qu[MaxSize]; //定義環
第十週作業1
1, (1)For each ... in: Explanation: 語法:for each(variable in object){