数据结构—二叉树的模拟实现(c语言)

目录

一.前言

二.模拟实现链式结构的二叉树

2.1二叉树的底层结构

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

2.3二叉树的销毁

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

2.5二叉树节点个数

2.6二叉树叶子节点个数

2.7二叉树第k层节点个数

三.二叉树的遍历

3.1前序遍历

3.2中序遍历

3.3后序遍历

3.4层序遍历


一.前言

详解—数据结构《树和二叉树》-CSDN博客

上一节课我们详解了树和二叉树,这一篇博客我来带领大家来模拟实现二叉树

二.模拟实现链式结构的二叉树

2.1二叉树的底层结构

首先,有一个数据域

然后有俩个二叉树指针,分别指向他们的左孩子和右孩子

typedef char BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;

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

1、按照前序遍历(先走根,再走左子树,再走右子树)的方法,我们首先了解大概思路

2、数组里面的#就相当于为空,所以,我们先判断if 我们的数组为#,就返回空

3、然后我们创建一个节点,如果开辟失败,返回空,我们进行判断

4、然后放入数据,

5、再然后递归开始走左子树,右子树

BTNode* BinaryTreeCreate(BTDataType* a, int n, int * pi)
{if ('#' == a[*pi]){++(*pi);return NULL;}BTNode * root = (BTNode *)malloc (sizeof(BTNode));if (root == NULL){perror("malloc");return;}root->data = a[(*pi)++];root->left = BinaryTreeCreate(a, n, pi);root->right = BinaryTreeCreate(a, n, pi);return root;
}

2.3二叉树的销毁

销毁一颗二叉树

1.首先判断如果是空树,直接返回

2.利用递归从最左边的树开始进行一个节点一个节点的删除

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

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

二叉树的查找在这里我用的前序遍历递归

1.先确定递归的退出条件,root等于空就返回

2.然后进行前序遍历

3.判断一下当前节点是不是x

4.在开始走左子树

5.开始走右子树

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{BTNode* node;if (root == NULL)return NULL ;//一开始就是 xif (root->data == x){return root;}//前序遍历寻找xnode = BinaryTreeFind(root->left, x);if (node)return node;node =BinaryTreeFind(root->right, x);if (node)return node;//遍历完找不到返回空return NULL;
}

2.5二叉树节点个数

二叉树的节点个数就是二叉树,左子树加上右子树加上根

这里我用的也是递归的方法,同学们可以看一下

int BinaryTreeSize(BTNode* root)
{return root == NULL ? 0 : BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right) + 1; 
}

2.6二叉树叶子节点个数

叶节点或终端节点:度为0的节点称为叶节点;

可以观看上一篇文章取了解叶子节点

详解—数据结构《树和二叉树》-CSDN博客

查找叶子节点,也是用的递归方法,

首先,增加递归退出条件root==0

然后,如果所在的节点他的左右子树都为空,那么他就是叶子节点,返回1

最后递归遍历所有的叶子节点进行相加

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);
}

2.7二叉树第k层节点个数

在二叉树中我们想知道,每一层有多少个节点

1.确定递归退出条件

2.如果k=1,返回1,代表找到了这一层的一个节点

3.进行递归,每一层k-1,当k=1是找到所在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);}

三.二叉树的遍历

3.1前序遍历

二叉树的遍历了解可以详细看看上一章节

详解—数据结构《树和二叉树》-CSDN博客 

前序遍历的遍历方法,就是先走根然后左子树,右子树

我们这里还是用的递归

1.先确定递归条件

2.打印当前节点

3.走左子树

4.走右子树

void BinaryTreePrevOrder(BTNode * root)
{if (root == NULL){return;}printf("%c ", root->data);BinaryTreePrevOrder(root->left);BinaryTreePrevOrder(root->right);
}

3.2中序遍历

中序遍历的顺序是先走左子树,再走根,再走右子树

我们的实现方法如下:

1.确定递归条件

2.走左子树

3.打印当前节点

4.走右子树

void BinaryTreeInOrder(BTNode* root)
{if (root == NULL){return;}BinaryTreeInOrder(root->left);printf("%c ", root->data);BinaryTreeInOrder(root->right);
}

3.3后序遍历

后序遍历的顺序是先走左子树,再走右子树,再走根

我们的实现方法如下:

1.确定递归条件

2.走左子树

3.走右子树

4.打印当前节点

void BinaryTreePostOrder(BTNode* root)
{if (root == NULL){return;}BinaryTreePostOrder(root->left);BinaryTreePostOrder(root->right);printf("%c ", root->data);
}

3.4层序遍历

首先,我们层序遍历,需要用到队列,我们先添加前几章写的队列到当前项目中,然后进行调用

1.创建并初始化一个队列

2.当根不为空时,将根节点入队,

3.保存根节点地址,访问其数据域,之后出队;

4.若根节点的左子树不为空,入队左子树,

5.判断根节点的右子树不为空,入队右子树,

6.保存队头节点地址,访问其数据域,之后出队;

8.重复上述过程的条件是队列不为空

void BinaryTreeLevelOrder(BTNode* root)
{Queue q;//初始化队列QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);printf("%c ", front->data);QueuePop(&q);if (front->left){QueuePush(&q, front->left);}if (front->right){QueuePush(&q, front->right);}}printf("\n");//销毁队列QueueDestroy(&q);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ConstraintLayout的基本用法

ConstraintLayout的基本用法 1、基线对齐——Baseline 有时候我们需要这样一个场景&#xff1a; app:layout_constraintBaseline_toBaselineOf"id/30"2、链——Chains 用于将多个控件形成一条链&#xff0c;可以用于平分空间。 <?xml version"1.0"…

【Bug】当用opencv库的imread()函数读取图像,用matplotlib库的plt.imshow()函数显示图像时,图像色彩出现偏差问题的解决方法

一&#xff0c;问题描述 我们在利用opencv的imread读取本地图像&#xff0c;进行一系列处理&#xff0c;但是发现用matplotlib库的imshow&#xff08;&#xff09;函数显示的时候出现色彩改变&#xff0c;比如图像偏黄&#xff0c;偏红&#xff0c;偏蓝等等&#xff0c;但是对…

2023年第十六届山东省职业院校技能大赛中职组“网络安全”赛项规程

第十六届山东省职业院校技能大赛 中职组“网络安全”赛项规程 一、赛项名称 赛项名称&#xff1a;网络安全 英文名称&#xff1a;Cyber Security 赛项组别&#xff1a;中职组 专业大类&#xff1a;电子与信息大类 二、竞赛目的 网络空间已经成为陆、海、空、天之后的第…

AI 时代的企业级安全合规策略

目录 漏洞分类管理的流程 安全策略管理 在扫描结果策略中定义细粒度的规则 有效考虑整个组织中的关键漏洞 确保职责分离 尝试组合拳 本文来源&#xff1a;about.gitlab.com 作者&#xff1a;Grant Hickman 在应用程序敏捷研发、敏捷交付的今天&#xff0c;让安全人员跟上…

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征&#xff1a;T恤的价格&#xff1b;分类&#xff1a;销售量高1/销售量低0&#xff1b;使用逻辑回归算法进行分类&#xff0c;拟合效果如下图所示&#xff1a; 1.1.2 神经元和神经网络 将逻辑回…

Module build failed (from ./node_modules/postcss-loader/src/index.js):

出现该错误是你可能没认真看官网的安装配置&#xff0c;可直接看该目录3&#xff0c;一个字一个字看 先安装uview 如果选择v1版本&#xff0c;建议使用npm下载&#xff0c;下面以v1版本为例&#xff0c;使用的是npm下载&#xff0c;导入uview时该文件也在node_modules文件夹里…

Anolis 8.6 安装 Drawio

Anolis 8.6 安装 Drawio 22.1.0 一.RPM版&#xff08;不建议&#xff09;二.WAR 包部署 一.RPM版&#xff08;不建议&#xff09; Draw RPM 包下载链接 RPM 包直接基于Linux图形化能力部署&#xff0c;服务器类型的Linux系统启动RPM包安装的Draw可能比较复杂 系统版本 ## 1.…

(一)正点原子I.MX6ULL kernel6.1移植准备

一、概述 学完了正点原子的I.MX6ULL移植&#xff0c;正点原子的教程是基于Ubuntu18&#xff0c;使用的是4.1.15的内核&#xff0c;很多年前的了。NXP官方也发布了新的6.1的内核&#xff0c;以及2022.04的uboot。 本文分享一下基于Ubuntu22.04&#xff08;6.2.0-36-generic&…

Unity中Shader的雾效

文章目录 前言一、Unity中的雾效在哪开启二、Unity中不同种类雾的区别1、线性雾2、指数雾1&#xff08;推荐用这个&#xff0c;兼具效果和性能&#xff09;3、指数雾2&#xff08;效果更真实&#xff0c;性能消耗多&#xff09; 三、在我们自己的Shader中实现判断&#xff0c;是…

【c++随笔12】继承

【c随笔12】继承 一、继承1、继承的概念2、3种继承方式3、父类和子类对象赋值转换4、继承中的作用域——隐藏5、继承与友元6、继承与静态成员 二、继承和子类默认成员函数1、子类构造函数 二、子类拷贝构造函数3、子类的赋值重载4、子类析构函数 三、单继承、多继承、菱形继承1…

设计模式-工厂方法

工厂方法是一种创建型设计模式&#xff0c;其在父类中提供一个创建对象的方法&#xff0c;允许子类决定实例化对象的类型。 问题 假设你开设了一个汽车工厂。创业初期工厂只能生产宝马这一款车&#xff0c;因此大部分代码都位于名为宝马的类中。 工厂效益非常好&#xff0c;为…

IDEA搭建ssm项目

此前&#xff0c;我一直在用eclipse编辑器做java项目&#xff0c;现在初次使用IDEA编辑器&#xff0c;在这里&#xff0c;我记录了使用IDEA环境下搭建ssm项目的过程。 创建Maven项目&#xff0c;如下 右击TEST4项目&#xff0c;在弹出的菜单中选择Add Framework Support 在弹出…

屏幕提词软件Presentation Prompter mac中文版使用方法

Presentation Prompter for mac是一款屏幕提词器软件&#xff0c;它可以将您的Mac电脑快速变成提词器&#xff0c;支持编写或导入&#xff0c;可以在一个或多个屏幕上平滑地滚动&#xff0c;Presentation Prompter 下载是为适用于现场表演者&#xff0c;新闻广播员&#xff0c;…

计算机网络——b站王道考研笔记

第一章 计算机网络体系结构 1.计算机网络概述 &#xff08;1&#xff09;概念 计算机网络是一个将分散的&#xff0c;具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统&#xff1b; 是互连的&#…

数据分析面试题1

1.右表为一组数据&#xff0c;尝试进行简单分析&#xff0c;并给出结论&#xff08;使用公式和图表辅助&#xff09; ①理解数据 userid&#xff1a;用户id神兽印记消耗数量 ②数据清洗 冻结首行&#xff0c;将列标题的英文字段转换成汉字字段检查是否有重复项&#xff1a;…

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…

基于springboot实现沁园健身房预约管理系统【项目源码】计算机毕业设计

基于springboot实现沁园健身房预约管理系统演示 B/S架构 B/S结构是目前使用最多的结构模式&#xff0c;它可以使得系统的开发更加的简单&#xff0c;好操作&#xff0c;而且还可以对其进行维护。使用该结构时只需要在计算机中安装数据库&#xff0c;和一些很常用的浏览器就可以…

Flink

1. Flink简介 1.1 初识Flink Flink项目的理念是&#xff1a;“Apache Flink是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源的有状态的流处理框架”。 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。Fl…

进亦忧,退亦忧,Github Copilot 集成进入 Visual Studio 带来的思考

开篇想到《岳阳楼记》的结尾&#xff1a; 不以物喜&#xff0c;不以己悲&#xff1b;居庙堂之高则忧其民&#xff1b;处江湖之远则忧其君。是进亦忧&#xff0c;退亦忧。然则何时而乐耶&#xff1f;其必曰&#xff1a;“先天下之忧而忧&#xff0c;后天下之乐而乐”乎。未来30…

HarmonyOS 高级特性

引言 本章将探讨 HarmonyOS 的高级特性&#xff0c;包括分布式能力、安全机制和性能优化。这些特性可以帮助你构建更强大、更安全、更高效的应用。 目录 HarmonyOS 的分布式能力HarmonyOS 的安全机制HarmonyOS 的性能优化总结 1. HarmonyOS 的分布式能力 HarmonyOS 的分布…