目录
一、二叉树的基本操作(递归)
输入格式:
第1行输入在二叉树中查找的元素。
第2行按先序顺序输入节点值构造二叉树,输入#代表节点为空,用#补全所有度不为 2 的节点,使其度为 2。例如:
ABD#E###CF##GH##I##
。测试数据保证能构成二叉树。
输出格式:
参照主函数及输出样例。输出格式使用
%c
,输出字符串中使用中文标点符号
。输入样例1:
E ABD#E###CF##GH##I##
输出样例1:
先序遍历二叉树:ABDECFGHI 中序遍历二叉树:DEBAFCHGI 后序遍历二叉树:EDBFHIGCA 二叉树中有节点元素E! 二叉树叶子节点总数为:4 二叉树节点总数为:9 二叉树深度为:4
输入样例2:
K RDA##C#B##GF#E###
输出样例2:
先序遍历二叉树:RDACBGFE 中序遍历二叉树:ADCBRFEG 后序遍历二叉树:ABCDEFGR 二叉树中没有节点元素K! 二叉树叶子节点总数为:3 二叉树节点总数为:8 二叉树深度为:4
#include <stdio.h>
#include <malloc.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
void CreatBiTree(BiTree &T); // 先序次序构造二叉树
void Visit(TElemType ch); // 访问节点元素
void PreOrderTraverse(BiTree &T); // 先序遍历二叉树
void InOrderTraverse(BiTree &T); // 中序遍历二叉树
void PostOrderTraverse(BiTree &T); // 后序遍历二叉树
BiTNode *SearchNode(BiTree &T, TElemType e); //查找元素e的节点位置
int BiTreeHigh(BiTree &T); //计算二叉树的深度
int CountLeaf(BiTree &T); // 统计二叉树叶子节点的个数
int CountNodes(BiTree &T); // 统计二叉树的节点个数
int main()
{
TElemType ch = getchar(); getchar();
BiTree T;
CreatBiTree(T);
printf("先序遍历二叉树:");
PreOrderTraverse(T);printf("\n");
printf("中序遍历二叉树:");
InOrderTraverse(T);printf("\n");
printf("后序遍历二叉树:");
PostOrderTraverse(T);printf("\n");
if(SearchNode(T, ch))
printf("二叉树中有节点元素%c!\n", ch);
else
printf("二叉树中没有节点元素%c!\n", ch);
printf("二叉树叶子节点总数为:%d\n", CountLeaf(T));
printf("二叉树节点总数为:%d\n", CountNodes(T));
printf("二叉树深度为:%d\n", BiTreeHigh(T));
return 0;
}
void Visit(TElemType ch) // 访问节点元素
{
printf("%c", ch);
return;
}
void CreatBiTree(BiTree &T)
{
char c;
scanf("%c",&c);
if(c == '#') T=NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
if(!T)
{
printf("内存空间申请失败!");
return;
}
T->data = c;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return;
}
void PreOrderTraverse(BiTree &T)
{
if(T)
{
Visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return;
}
void InOrderTraverse(BiTree &T)
{
if(T)
{
InOrderTraverse(T->lchild);
Visit(T->data);
InOrderTraverse(T->rchild);
}
return;
}
void PostOrderTraverse(BiTree &T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
Visit(T->data);
}
return;
}
BiTNode *SearchNode(BiTree &T, TElemType e)
{
if(!T) return NULL;
if(T->data == e) return T;
else
{
BiTree q = SearchNode(T->lchild,e);
if(!q) return SearchNode(T->rchild,e);
return q;
}
}
int BiTreeHigh(BiTree &T)
{
int h1,h2;
if(!T) return 0;
else
{
h1 = BiTreeHigh(T->lchild);
h2 = BiTreeHigh(T->rchild);
return h1>h2? ++h1:++h2;
}
}
int CountLeaf(BiTree &T) // 统计二叉树叶子节点的个数
{
if(T)
{
if(!T->lchild && !T->rchild)
return 1;
else
return CountLeaf(T->lchild) + CountLeaf(T->rchild);
}
return 0;
}
int CountNodes(BiTree &T) // 统计二叉树的节点个数
{
if(T)
{
if(!T->lchild && !T->rchild)
return 1;
else
return 1 + CountNodes(T->lchild) + CountNodes(T->rchild);
}
return 0;
}
二、二叉树的基本操作(非递归)
输入格式:
在一行中按先序顺序输入节点值构造二叉树,#代表节点为空。
其中用#补全所有度不为 2 的节点,使其度为 2。例如:
ABD#E###CF##GH##I##
。测试数据保证能构成二叉树。
输出格式:
参照主函数及输出样例。
输出格式使用%c,输出字符串中使用中文标点符号
。输入样例:
ABD#E###CF##GH##I##
输出样例:
先序非递归遍历二叉树:ABDECFGHI 中序非递归遍历二叉树:DEBAFCHGI 后序非递归遍历二叉树:EDBFHIGCA 层次遍历二叉树(从上到下,每层从左到右):ABCDFGEHI
三、赫夫曼树的基本操作
输入格式:
在第1行输入创建赫夫曼树的节点个数 N,
1 < N < 100
。后面 N 行,分别输入创建赫夫曼树节点的元素及其权值,元素和其权值用空格隔开。其中元素为单个字符,权值不大于10000。例如:
A 12
最后一行输入需要解码的密码串。例如:
01000101101110
测试数据保证有效。且为了保证构造的赫夫曼树唯一,
在选择节点时,序号小的构造左子树,序号大的构造右子树
。输出格式:
参照主函数及输出样例。输出字符串中使用中文标点符号。
注意:程序已提供赫夫曼树及编码的打印输出函数。
输入样例:
4 a 10 b 9 c 12 d 8 01000101101110
输出样例:
id,data,weight,parent,lchild,rchild 1: a, 10, 6, 0, 0 2: b, 9, 5, 0, 0 3: c, 12, 6, 0, 0 4: d, 8, 5, 0, 0 5:--, 17, 7, 2, 4 6:--, 22, 7, 1, 3 7:--, 39, 0, 5, 6 a:10 b:00 c:11 d:01 编码01000101101110对应的字符串是:dbddaca