当前位置: 首页 > news >正文

二叉树的实现(纯C语言版)

目录

  • 1.实现的接口
    • 1.1通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
  • 1.2 二叉树销毁
    • 1.3二叉树节点个数
    • 1.4二叉树第k层节点个数
    • 1.5 二叉树查找值为x的节点
    • 1.6二叉树前序遍历
    • 1.7二叉树中序遍历
    • 1.8二叉树后序遍历
    • 1.9层序遍历
    • 1.10判断二叉树是否是完全二叉树
    • 1.11 二叉树叶子节点个数

1.实现的接口

1.1通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);


if (a[*pi] == '#' || (*pi) >= n)
{(*pi)++;return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->_data = a[*pi];
(*pi)++;
root->_left = BinaryTreeCreate(a, n, pi);
root->_right = BinaryTreeCreate(a, n, pi);
return root;

1.2 二叉树销毁

// 二叉树销毁
void BinaryTreeDestory(BTNode** root);

void BinaryTreeDestory(BTNode* root)
{if (root == NULL)return;BinaryTreeDestory(root->_left);BinaryTreeDestory(root->_right);free(root);
}

1.3二叉树节点个数

// 二叉树节点个数
int BinaryTreeSize(BTNode* root);


int BinaryTreeSize(BTNode* root)
{if (root == NULL)return 0;static size = 0;size++;BinaryTreeSize(root->_left);BinaryTreeSize(root->_right);return size;}

1.4二叉树第k层节点个数

// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);


int BinaryTreeLevelKSize(BTNode* root, int k)
{if (root == NULL)return 0;if (k == 1)return 1;return BinaryTreeLevelKSize(root->_left, k - 1) + BinaryTreeLevelKSize(root->_right, k - 1);}

1.5 二叉树查找值为x的节点

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->_data == x)return root;BTNode* left = BinaryTreeFind(root->_left, x);if (left)return left;BTNode*right = BinaryTreeFind(root->_right, x);if (right)return right;
}

1.6二叉树前序遍历

// 二叉树前序遍历
void BinaryTreePrevOrder(BTNode* root);

void BinaryTreePrevOrder(BTNode* root)
{if (root == NULL)return;printf("%c ", root->_data);BinaryTreePrevOrder(root->_left);BinaryTreePrevOrder(root->_right);
}

1.7二叉树中序遍历

// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root);

void BinaryTreeInOrder(BTNode* root)
{BinaryTreeInOrder(root->_left);printf("%c ", root->_data);BinaryTreeInOrder(root->_right);}

1.8二叉树后序遍历

// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root);


void BinaryTreePostOrder(BTNode* root)
{BinaryTreePostOrder(root->_left);BinaryTreePostOrder(root->_right);printf("%c ", root->_data);
}

1.9层序遍历

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root);

void BinaryTreeLevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* node=QueueFrontdata(&q);printf("%c ", node->_data);QueuePop(&q);if (node->_left){QueuePush(&q, node->_left);}if (node->_right){QueuePush(&q, node->_right);}}}

1.10判断二叉树是否是完全二叉树

// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root);


int BinaryTreeComplete(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* tmp= QueueFrontdata(&q);QueuePop(&q);if (tmp == NULL)break;QueuePush(&q, tmp->_left);QueuePush(&q, tmp->_right);}while (!QueueEmpty(&q)){if (QueueFrontdata(&q) != NULL){QueueDestory(&q);return false;}QueuePop(&q);}QueueDestory(&q);return true;
}

1.11 二叉树叶子节点个数

// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);

int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL)return 0;if (root->_left == NULL && root->_right == NULL)return 1;return BinaryTreeLeafSize(root->_left)+ BinaryTreeLeafSize(root->_right);}

结尾:今天的分享到此结束,喜欢的朋友如果感觉有帮助可以点赞三连支持,咱们共同进步!

相关文章:

  • Backend - Django JsonResponse HttpResponse
  • Golang实践录:读取xml配置文件
  • 堆排序详细解读
  • 应急响应-挖矿病毒处理
  • 掌握 Go 语言中的循环结构:从基础到高级
  • ESP32 LVGL Gui-Guider的移植
  • openGauss学习笔记-141 openGauss 数据库运维-例行维护-例行重建索引
  • Python面向对象练习
  • php轻量级性能分析工具 xhprof
  • 场景实践 | 法大大落地业财一体化,优化流程结构
  • SpringBoot之整合JWT
  • 深度学习机器视觉车道线识别与检测 -自动驾驶 计算机竞赛
  • Vue框架学习笔记——列表渲染:v-for
  • canvas绘制小丑
  • 【Vue】使用 Vue CLI 脚手架创建 Vue 项目(使用命令行创建)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Angular 2 DI - IoC DI - 1
  • Angularjs之国际化
  • CentOS 7 防火墙操作
  • Centos6.8 使用rpm安装mysql5.7
  • js继承的实现方法
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • mysql中InnoDB引擎中页的概念
  • npx命令介绍
  • Shell编程
  • Spring Cloud中负载均衡器概览
  • 分布式事物理论与实践
  • 回顾2016
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  •  一套莫尔斯电报听写、翻译系统
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 终端用户监控:真实用户监控还是模拟监控?
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​queue --- 一个同步的队列类​
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)(2.10) LTM telemetry
  • (2)MFC+openGL单文档框架glFrame
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)终结任务
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • .bashrc在哪里,alias妙用
  • .net core使用ef 6
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net 后台导出excel ,word
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .vue文件怎么使用_vue调试工具vue-devtools的安装