二叉树的基本操作

 具体原理参考《数据结构(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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星猫仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值