#define _CRT_SECURE_NO_WARNINGS 1
#include "BiTree.h"
//二叉树的初始化
void BTInit(BTL* T) {
assert(T);
*T = NULL;
//BTL为一级指针类型,这里的参数T为二级指针类型,因此需要对其解引用
}
//二叉树的创建——创建BST
void CreatBST(BTL* T, ElemType x) {
assert(T);
BTN* p = (BTN*)calloc(1, sizeof(BTN));//创建结点
if (!p) {
perror("CreatBST calloc fail");//空间申请失败时报错
return;
}
p->data = x;//将数据放入x中
p->lchild = p->rchild = NULL;//将左右指针置空
BTN* t = *T;//指向根结点的指针
while (t) {
if (t->data < p->data && t->rchild) //当根<该结点,且右子树不为空树时
t = t->rchild;//继续向右子树遍历
else if (t->data > p->data && t->lchild)//当根>该结点,且左子树不为空树时
t = t->lchild;//继续向左子树遍历
else if (t->data < p->data && !t->rchild)//当根结点<该结点并且右子树为空时
{
t->rchild = p;//将该结点插入右子树
return;
}
else if (t->data > p->data && !t->lchild)//当根结点>该结点并且左子树为空时
{
t->lchild = p;//将该结点插入左子树
return;
}
else {
printf("树中已存在结点%d,插入失败\n", p->data);
return;
}
}
*T = p;//当未进入循环时,说明该树为空树,直接将该结点作为根结点插入树中
return;
}
//二叉树的创建——通过遍历序列创建二叉树
BTN* BTCreat(ElemType* arr, int* pi) {
//T为二级指针
//arr为存放序列的数组
//pi为数组下标
assert(arr && pi);
//限制条件
if (!arr[*pi])//元素为'\0'时
return NULL;//结束创建
if (arr[*pi] == '#') {
//当元素为'#'时,二叉树对应结点为空
(*pi)++;//继续向后遍历
return NULL;//返回空指针
}
//创建根结点
BTN* p = (BTN*)calloc(1, sizeof(BTN));
if (!p) {
perror("BTCreat calloc fail");
return;
}
p->data = arr[(*pi)++];//访问根结点
p->lchild = BTCreat(arr, pi);//遍历创建左子树
p->rchild = BTCreat(arr, pi);//遍历创建右子树
return p;
}
//二叉树的销毁
void BTDestroy(BTL* T) {
assert(T);
if (!(*T))
return;
//通过后序遍历销毁二叉树
BTDestroy(&((*T)->lchild));
BTDestroy(&((*T)->rchild));
free(*T);//释放叶结点的内存
*T = NULL;
}
//访问根结点
void visit(BTN* root) {
printf("%d ", root->data);
}
//先序遍历
void PreOrder(BTL T) {
if (!T)
return;
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
//中序遍历
void InOrder(BTL T) {
if (!T)
return;
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
//后序遍历
void PostOrder(BTL T) {
if (!T)
return;
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
//层序遍历
void LevelOrder(BTL T) {
if (!T)
return;
LQ Q;
QueueInit(&Q);
BTN* p = T;
EnQueue(&Q, p);
while (!isEmptyQueue(Q)) {
DeQueue(&Q, &p);
visit(p);
if (p->lchild)
EnQueue(&Q, p->lchild);
if (p->rchild)
EnQueue(&Q, p->rchild);
}
}
//求树高
int Depth(BTL T) {
if (!T)
return 0;
int l = Depth(T->lchild);
int r = Depth(T->rchild);
return l > r ? l + 1 : r + 1;
}
//求结点总数
int BTSize(BTL T) {
if (!T)
return 0;
int l = BTSize(T->lchild);
int r = BTSize(T->rchild);
return l + r + 1;
}
//求第K层结点数
int BTLevelKSize(BTL T, int k) {
if (!T)
return 0;
if (k == 1)
return 1;
int l = BTLevelKSize(T->lchild, k - 1);
int r = BTLevelKSize(T->rchild, k - 1);
return l + r;
}
//求叶结点数
int BTLeafSize(BTL T) {
if (!T)
return 0;
if (!T->lchild && !T->rchild)
return 1;
int l = BTLeafSize(T->lchild);
int r = BTLeafSize(T->rchild);
return l + r;
}
//二叉树基本操作的测试
void test1() {
BTL T;//创建二叉链表
BTInit(&T);//初始化二叉链表
ElemType arr[100] = { 0 };
int ret = scanf("%s", arr);//获取先序序列
int i = 0;//数组下标
T = BTCreat(arr, &i);//通过先序序列创建二叉树
//通过遍历获取遍历序列
printf("\n先序序列为:");
PreOrder(T);
printf("\n中序序列为:");
InOrder(T);
printf("\n后序序列为:");
PostOrder(T);
printf("\n层序序列为:");
LevelOrder(T);
int hight = Depth(T);
printf("\n\n该二叉树的高度为%d\n", hight);
int T_size = BTSize(T);
printf("\n该二叉树总共有%d个结点\n", T_size);
int k = 0;
getchar();//清空缓冲区
printf("\n");
while (scanf("%d", &k) == 1) {
int K_size = BTLevelKSize(T, k);
printf("第%d层共有%d个结点\n\n", k, K_size);
}
int leaf = BTLeafSize(T);
printf("\n该二叉树共有%d个叶结点\n", leaf);
BTDestroy(&T);
T_size= BTSize(T);
printf("\n完成销毁后该二叉树总共有%d个结点\n\n", T_size);
}
//二叉树基本操作的测试2
void test2() {
BTL T;//创建二叉链表
BTInit(&T);//初始化二叉链表
ElemType e = 0;
while (scanf("%d", &e) == 1)
CreatBST(&T, e);//创建BST
//通过遍历获取遍历序列
printf("\n先序序列为:");
PreOrder(T);
printf("\n中序序列为:");
InOrder(T);
printf("\n后序序列为:");
PostOrder(T);
printf("\n层序序列为:");
LevelOrder(T);
int hight = Depth(T);
printf("\n\n该二叉树的高度为%d\n", hight);
int T_size = BTSize(T);
printf("\n该二叉树总共有%d个结点\n", T_size);
int k = 0;
getchar();//清空缓冲区
printf("\n");
while (scanf("%d", &k) == 1) {
int K_size = BTLevelKSize(T, k);
printf("第%d层共有%d个结点\n\n", k, K_size);
}
int leaf = BTLeafSize(T);
printf("\n该二叉树共有%d个叶结点\n", leaf);
BTDestroy(&T);
T_size = BTSize(T);
printf("\n完成销毁后该二叉树总共有%d个结点\n\n", T_size);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
该资源中为【数据结构】专栏——C语言实现二叉树篇章中涉及到的代码 代码中包含以下内容: 1. 二叉树相关头文件: - 二叉链表的数据类型声明 - 链队列结点类型声明 - 链队列类型声明 - 二叉树基本功能(二叉树的初始化、创建BST、通过遍历序列创建二叉树、销毁二叉树、访问根结点、先序遍历、中序遍历、后序遍历、层序遍历、求深度、求结点总数、求第K层结点总数、求叶结点数)接口声明 - 链队列的初始化/入队/出队/判空等函数接口声明 - 测试函数接口声明 2. 二叉树相关.C文件: - 二叉树初始化的实现 - 创建BST的实现 - 通过遍历序列创建二叉树的实现 - 销毁二叉树的实现 - 访问根结点的实现 - 先序遍历、中序遍历、后序遍历的递归实现 - 层序遍历的实现 - 求二叉树深度的递归实现 - 求二叉树结点总数的递归实现 - 求二叉树第K层结点数的递归实现 - 求二叉树叶结点数的递归实现 - 功能测试函数的实现——通过层序遍历创建二叉树、创建BST 3. 队列基本功能实现文件
资源推荐
资源详情
资源评论
收起资源包目录
二叉树的C语言实现.zip (31个子文件)
.vs
24.05.22_CSDN_blog
v16
Browse.VC.db 1.66MB
.suo 39KB
ipch
AutoPCH
c1fe70a7aa624f9c
BITREE.ipch 2.44MB
961d2b536d813cba
QUEUE.ipch 2.44MB
cfb61c494790c459
TEST.ipch 2.44MB
c1fe7ba7aa62624d
BITREE.ipch 2.31MB
24.05.22_CSDN_blog.sln 1KB
24.05.22_CSDN_blog
BiTree.c 5KB
test.c 98B
Queue.c 953B
24.05.22_CSDN_blog.vcxproj.user 168B
BiTree.h 1KB
24.05.22_CSDN_blog.vcxproj 7KB
Debug
test.obj 4KB
vc142.idb 59KB
vc142.pdb 76KB
24.05.22_CSDN_blog.log 910B
24.05.22_CSDN_blog.exe.recipe 314B
BiTree.obj 31KB
24.05.22_CSDN_blog.ilk 466KB
Queue.obj 8KB
24.05.22.f017ca2e.tlog
CL.write.1.tlog 2KB
24.05.22_CSDN_blog.lastbuildstate 208B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 950B
CL.read.1.tlog 7KB
24.05.22_CSDN_blog.vcxproj.filters 1KB
Debug
24.05.22_CSDN_blog.exe 45KB
24.05.22_CSDN_blog.pdb 996KB
共 31 条
- 1
资源评论
蒙奇D索大
- 粉丝: 1936
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功