二叉树的基本操作实现
#include<iostream>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else
{
T = new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrder(BiTree T)
{
if (T)
{
cout << T->data<<" ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void MidOrder(BiTree T)
{
if (T)
{
MidOrder(T->lchild);
cout << T->data<<" ";
MidOrder(T->rchild);
}
}
void EndOrder(BiTree T)
{
if (T)
{
EndOrder(T->lchild);
EndOrder(T->rchild);
cout << T->data<<" ";
}
}
void Levle(BiTree T)
{
BiTree Queue[100], b;
int front, rear;
front = rear = 0;
if (T)
{
Queue[rear++] = T;
while (front != rear)
{
b = Queue[front++];
cout << b->data<<" ";
if (b->lchild != NULL)
Queue[rear++] = b->lchild;
if (b->rchild != NULL)
Queue[rear++] = b->rchild;
}
}
cout << endl;
}
int main()
{
BiTree T;
CreateBiTree(T);
cout << "先序输出" << endl;
PreOrder(T);
cout << endl;
cout << "中序输出" << endl;
MidOrder(T);
cout << endl;
cout << "后序输出" << endl;
EndOrder(T);
cout << endl;
cout << "层序输出" << endl;
Levle(T);
system("pause");
return 0;
}
哈夫曼树和哈夫曼编码
#include<iostream>
using namespace std;
#pragma warning(disable:4996)
typedef struct {
int weight;
int parent, lchild, rchild;
}HTNode, *HuffmanTree;
void Select(HuffmanTree &HT, int n, int &s1, int &s2)
{
int p1 = 2000, p2 = 2000;
for (int i = 1; i <= n; i++)
{
if (HT[i].parent == 0)
{
if (HT[i].weight < p2)
{
p2 = HT[i].weight; s2 = i;
if (p2 < p1)
{
int k = p2; int b = s2;
p2 = p1; s2 = s1;
p1 = k; s1 = b;
}
}
}
}
}
void CreateHuffmanTree(HuffmanTree &HT, int n, int *data)
{
int s1 = 0; int s2 = 0;
if (n <= 1)return;
int m = 2 * n - 1;
HT = new HTNode[m + 1];
for (int i = 1; i <= m; ++i)
{
HT[i].parent = HT[i].rchild = HT[i].lchild = 0;
}
for (int i = 1; i <= n; i++)
{
HT[i].weight = data[i - 1];
}
for (int i = n + 1; i <= m; i++)
{
Select(HT, i - 1, s1, s2);
HT[s1].parent = i; HT[s2].parent = i;
HT[i].lchild = s1; HT[i].rchild = s2;
HT[i].weight = HT[s1].weight + HT[s2].weight;
}
}
typedef char **HuffmanCode;
void CreatHuffmanCode(HuffmanTree &HT, HuffmanCode &HC, int n)
{
HC = new char*[n + 1];
char* cd = new char[n];
cd[n - 1] = '\0';
for (int i = 1; i <= n; i++)
{
int start = n - 1;
int c = i; int f = HT[i].parent;
while (f != 0)
{
start--;
if (HT[f].lchild == c)cd[start] = '0';
else cd[start] = '1';
c = f; f = HT[f].parent;
}
HC[i] = new char[n - start];
strcpy(HC[i], &cd[start]);
}
delete cd;
}
struct Form {
char a[100];
int b[100];
};
void HuffShow(HuffmanTree &HT, int n)
{
cout << "---------------------" << endl;
int m = 2 * n;
for (int i = 1; i < m; ++i)
{
cout << HT[i].weight << " " << HT[i].parent << " " << HT[i].lchild << " " << HT[i].rchild << endl;
}
cout << "--------------------" << endl;
}
int main()
{
Form form;
HuffmanTree HT;
HuffmanCode HC;
cout << "请输入字母及其频率\n空格分隔,0 0结束输入" << endl;
int num;
for (num = 0; num < 100; num++)
{
cin >> form.a[num] >> form.b[num];
if (form.a[num] == '0' || form.b[num] == 0)
break;
}
CreateHuffmanTree(HT, num, form.b);
CreatHuffmanCode(HT, HC, num);
cout << "哈夫曼编码如下" << endl;
cout << "--------------------" << endl;
for (int i = 0; i < num; i++)
{
cout << form.a[i] << "--->" << HC[i + 1] << endl;
}
cout << "--------------------" << endl;
system("pause");
}