具体原理参考《数据结构(C语言)》第二版——人民邮电出版社
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<queue>
//#define QUEUESIZE 100 //遍历过程中需要使用的队列的容量,根据实际需求调整
typedef char ElemType;
typedef struct btnode {
ElemType element;
struct btnode* lchild;
struct btnode* rchild;
}BTNode;
typedef struct binarytree {
BTNode* root;
}BinaryTree;
void PreOrder(BTNode* t);//解决PreOrder未命名的标识符问题
void MidOrder(BTNode* t);
void BhdOrder(BTNode* t);
void Clear(BTNode* t);
int Size(BTNode* t);
int LeafSize(BTNode* t);
int Height(BTNode* t);
void Swap(BTNode* t);
//先序遍历法创建二叉树
BTNode* PreCreatBT(BTNode* t) {
char ch;
ch = getchar(); //输入先序规则下当前子树根节点的元素
if (ch == '#') {
t = NULL; //输入‘#’表示这里建立空二叉树,即遍历算法的空操作
}
else
{
t = (BTNode*)malloc(sizeof(BTNode));
t->element = ch; //构造根节点
t->lchild = PreCreatBT(t->lchild); //构造左子树
t->rchild = PreCreatBT(t->rchild); //构造右子树
}
return t;
}
void PreMakeTree(BinaryTree* bt) {
bt->root = PreCreatBT(bt->root);
}
//先序遍历(VLR)
void PreOrderTree(BinaryTree* bt) {
PreOrder(bt->root);
}
void PreOrder(BTNode* t) {
if (!t)
return;
printf("%c", t->element);//访问根节点
PreOrder(t->lchild); //先序遍历左子树
PreOrder(t->rchild); //先序遍历右子树
}
//中序遍历(LVR)
void MidOrderTree(BinaryTree* bt) {
MidOrder(bt->root);
}
void MidOrder(BTNode* t) {
if (!t)
return;
MidOrder(t->lchild); //中序遍历左子树
printf("%c", t->element);//访问根节点
MidOrder(t->rchild); //中序遍历右子树
}
//后序遍历(LRV)
void BhdOrderTree(BinaryTree* bt) {
BhdOrder(bt->root);
}
void BhdOrder(BTNode* t) {
if (!t)
return;
BhdOrder(t->lchild); //后序遍历左子树
BhdOrder(t->rchild); //后序遍历右子树
printf("%c", t->element);//访问根节点
}
//清空二叉树
void TreeClear(BinaryTree* bt) {
Clear(bt->root);
}
void Clear(BTNode* t) {
if (!t)
return;
Clear(t->lchild);
Clear(t->rchild);
free(t);
}
//计算结点个数
void TreeSize(BinaryTree* bt) {
Size(bt->root);
}
int Size(BTNode* t) {
if (!t)
return 0;
return Size(t->lchild) + Size(t->rchild) + 1;
}
//计算叶结点数
void TreeLeafSize(BinaryTree* bt) {
LeafSize(bt->root);
}
int LeafSize(BTNode* t) {
if (!t)
return 0;
else if (!t->lchild && !t->rchild)
return 1;
return LeafSize(t->lchild) + LeafSize(t->rchild);
}
//计算树高
void TreeHeight(BinaryTree* bt) {
Height(bt->root);
}
int Height(BTNode* t) {
if (!t)
return 0;
//如果左孩子大于等于右孩子,则左孩子加1;否则右孩子加1
return Height(t->lchild) >= Height(t->rchild) ? Height(t->lchild) + 1 : Height(t->rchild) + 1;
}
//交换左右子树
void TreeSwap(BinaryTree* bt) {
Swap(bt->root);
}
void Swap(BTNode* t) {
BTNode* temp;
if (!t)
return;
temp = t->lchild;
t->lchild = t->rchild;
t->rchild = temp;
Swap(t->lchild);
Swap(t->rchild);
}
int main() {
BTNode* t;
t = NULL;
t = PreCreatBT(t);
printf("\n先序遍历的结果是:");
PreOrder(t);
printf("\n中序遍历的结果是:");
MidOrder(t);
printf("\n后序遍历的结果是:");
BhdOrder(t);
printf("\n二叉树的结点个数为:%d", Size(t));
printf("\n叶结点的个数:%d", LeafSize(t));
printf("\n二叉树的高度为:%d", Height(t));
Swap(t);
printf("\n交换后先序遍历为:");
PreOrder(t);
printf("\n交换后中序遍历为:");
MidOrder(t);
printf("\n交换后后序遍历为:");
BhdOrder(t);
printf("\n");
Clear(t);
system("pause");
return 0;
}