【数据结构—二叉树的链式结构实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

一、二叉树的存储结构

二、二叉树链式结构的实现

2.1手动构建一课树

2.2二叉树的遍历

三、二叉树链式结构的实现

3.1前序遍历(递归)

3.2中序遍历(递归)

3.3后序遍历(递归)

3.4层序遍历(非递归)

3.5求一棵二叉树节点的个数

3.6叶子节点的个数

3.7二叉树的高度

3.8求第k层的节点个数

3.9二叉树中查找值为x的节点

3.10通过前序遍历的数组构建二叉树("ABD##E#H##CF##G##",#是空)

3.11判断一棵树是否是完全二叉树

3.12销毁一棵树

四、二叉树的性质

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

一、二叉树的存储结构

链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面课程学到高阶数据结构如红黑树等会用到三叉链。

二、二叉树链式结构的实现

2.1手动构建一课树

方法一:

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}TreeNode;//手动构建一课树(方法一)
TreeNode* CreateTree()
{TreeNode* node1 = (TreeNode*)malloc(sizeof(TreeNode));assert(node1);TreeNode* node2 = (TreeNode*)malloc(sizeof(TreeNode));assert(node2);TreeNode* node3 = (TreeNode*)malloc(sizeof(TreeNode));assert(node3);TreeNode* node4 = (TreeNode*)malloc(sizeof(TreeNode));assert(node4);TreeNode* node5 = (TreeNode*)malloc(sizeof(TreeNode));assert(node5);TreeNode* node6 = (TreeNode*)malloc(sizeof(TreeNode));assert(node6);node1->data = 1;node2->data = 2;node3->data = 3;node4->data = 4;node5->data = 5;node6->data = 6;node1->left = node2;node1->right = node4;node2->left = node3;node2->right = NULL;node3->left = NULL;node3->right = NULL;node4->left = node5;node4->right = node6;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;return node1;
}

方法二:

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}TreeNode;TreeNode* BuyTreeNode(int x)
{TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));assert(node);node->data = x;node->left = NULL;node->right = NULL;return node;
}//手动构建一课树(方法二)
TreeNode* CreateTree()
{TreeNode* node1 = BuyTreeNode(1);TreeNode* node2 = BuyTreeNode(2);TreeNode* node3 = BuyTreeNode(3);TreeNode* node4 = BuyTreeNode(4);TreeNode* node5 = BuyTreeNode(5);TreeNode* node6 = BuyTreeNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;
}

2.2二叉树的遍历

前序遍历递归图解:

三、二叉树链式结构的实现

3.1前序遍历(递归)

//前序遍历(递归)
void PrevOrder(TreeNode* root)
{if (root == NULL){printf("NULL ");return;}printf("%d ", root->data);PrevOrder(root->left);PrevOrder(root->right);
}

3.2中序遍历(递归)

//中序遍历(递归)
void InOrder(TreeNode* root)
{if (root == NULL){printf("NULL ");return;}PrevOrder(root->left);printf("%d ", root->data);PrevOrder(root->right);
}

3.3后序遍历(递归)

//后序遍历(递归)
void BackOrder(TreeNode* root)
{if (root == NULL){printf("NULL ");return;}BackOrder(root->left);BackOrder(root->right);printf("%d ", root->data);
}

3.4层序遍历(非递归)

层序遍历(原理:上一层出来依次带入下一层),要利用队列先进先出的规则。

3.5求一棵二叉树节点的个数

方法一:

方法二:

方法三:

3.6叶子节点的个数

//叶子节点的个数
int TreeLeafSize(TreeNode* root)
{//返回条件有两个//1、空  返回0if (root == NULL)return 0;//2、不是空,是叶子,返回1if (root->left == NULL && root->right == NULL)return 1;//不是空,也不是叶子,分治=左右子树叶子之和return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

3.7二叉树的高度

方法一:

//求二叉树的高度
int TreeHeight(TreeNode* root)
{//空树,返回0if (root == NULL)return 0;//不是空树,左子树高度与右子树高度比较,大的高度+1//记录一下左右子树的高度int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

方法二:

//求二叉树的高度
int TreeHeight(TreeNode* root)
{//空树,返回0if (root == NULL)return 0;//不是空树,左子树高度与右子树高度比较,大的高度+1//记录一下左右子树的高度(fmax:C语言的库函数)return fmax(TreeHeight(root->left),TreeHeight(root->right))+1;
}

3.8求第k层的节点个数

3.9二叉树中查找值为x的节点

3.10通过前序遍历的数组构建二叉树("ABD##E#H##CF##G##",#是空)

// 通过前序遍历的数组构建二叉树("ABD##E#H##CF##G##",#是空)
TreeNode* TreeCreate(char* a, int* pi)
{if (a[*pi] == '#'){(*pi)++;return NULL;}TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));if (root == NULL){perror("malloc fail");exit(-1);}root->data = a[(*pi)++];root->left = TreeCreate(a, pi);root->right = TreeCreate(a, pi);return root;
}

3.11判断一棵树是否是完全二叉树

//判断一棵树是否是完全二叉树
bool TreeComplete(TreeNode* root)
{//队列内要放的是节点,因为我们还要节点的左右孩子Queue q;QueueInit(&q);if (root)QueuePush(&q, root);//push的是一个节点的指针,也就是push的是节点里面的一个值while (!QueueEmpty(&q)){TreeNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL)break;QueuePush(&q, front->left);QueuePush(&q, front->right);}//前面的遇到空以后,后面还有非空就不是完全二叉树while (!QueueEmpty(&q)){TreeNode* front = QueueFront(&q);QueuePop(&q);if (front){QueueDestroy(&q);return false;}}QueueDestroy(&q);return true;
}

3.12销毁一棵树

四、二叉树的性质

节点的度:一个节点含有的子树的个数称为该节点的度。

树的度:一棵树中,最大的节点的度称为树的度。


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

人机交互主板定制_基于MT8735安卓核心板的自助查询机方案

人机交互主板是一种商显智能终端主板,广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台,四核Cortex-A53架构…

CTF之Misc杂项干货

目录 一、常见编码 二、文件分析与处理 三、隐写工具与命令 四、隐写术实例 一、常见编码 1、base家族 2、进制转换 3、摩斯、希尔、凯撒、仿射、栏栅、维吉尼亚、培根、键盘、rabbit、rot13、AES、md5、RSA等 (md5、RSA可能不会出现在杂项里,但…

OpenHarmony从入门到放弃(三)

OpenHarmony最新的已经使用Ets进行开发了,但是我在使用过程中需要兼容更低的版本,而且大部分的第三方库还是不能使用,所以接下来我还是使用Java进行开发。 一、跳转页面 首先对首页的文字绑定事件; Text myText findComponent…

大数据可视化Web框架——飞致云Dataease在Windows端的安装指南(多图说明版)V2.2最新版

DataEase开源代码在Windows系统开发环境搭建与调试指南_怎么部署dataease 2.0-CSDN博客https://blog.csdn.net/tllhc01/article/details/135220598?spm1001.2014.3001.5502参考这一篇,基于dataease2.2源码进行构建 需要先下载三个文件,且版本一一对应均…

USB 转 TTL线直接读取DS18B20

简介 使用USB转TTL线直接读取DS18B20 温度。 电路图 绘制图 实物图 软件 Download 1-Wire/iButton Drivers for Windows 操作 所有的线路连接好之后将 USB 转 TTL线接到PC上; 安装软件 Download 1-Wire/iButton Drivers for Windows 并打开 软件打开之后先选择串口后 …

【四】CocosCreator-修改引擎源码

看源码的过程中,少不了得修修改改源码,做点实验。果断去找找源码在哪里,然后就可以快乐动手改源码了。 CocosCreator引擎源码主要就是js和原生C两类,分别在引擎目录的resources/engine和resources/cocos2d-x下,如图&am…

【LMM 009】MiniGPT-4:使用 Vicuna 增强视觉语言理解能力的多模态大模型

论文描述:MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 论文作者:Deyao Zhu∗ Jun Chen∗ Xiaoqian Shen Xiang Li Mohamed Elhoseiny 作者单位:King Abdullah University of Science and Techn…

使用Kafka与Spark Streaming进行流数据集成

在当今的大数据时代,实时数据处理和分析已经变得至关重要。为了实现实时数据集成和分析,组合使用Apache Kafka和Apache Spark Streaming是一种常见的做法。本文将深入探讨如何使用Kafka与Spark Streaming进行流数据集成,以及如何构建强大的实…

分布式(10)

目录 46.什么是Session Replication? 47.什么是Session数据集中存储? 48.什么是Cookie Based Session? 49.什么是JWT?使用JWT的流程?对比传统的会话有啥区别? 50.如何设计一个秒杀系统? 51.接口设计要考虑哪…

微信小程序:flex常用布局

在我们平时微信小程序开发过程中为了页面能达到设计小伙伴的预期,追求还原度,那我们肯定会使用很多常用的布局方式,那我们今天就介绍一下微信小程序中常用的一些flex布局 1、常用flex布局 /** 水平垂直居中 **/ .flex-center {display: fle…

企业微信开发:自建应用:获取企业微信IP段(用于防火墙配置)

概述 在企业微信开发流程中,为了确保与企业微信API的网络通信安全,并适应防火墙配置要求,开发者需要获取企业微信API服务的IP地址范围。这样,仅允许与企业微信官方通信的合法请求通过防火墙,从而保障数据传输的安全性…

ubuntu环境安装配置nginx流程

今天分享ubuntu环境安装配置nginx流程 一、下载安装 1、检查是否已经安装 nginx -v 结果 2、安装 apt install nginx-core 过程 查看版本:nginx -v 安装路径:whereis nginx nginx文件安装完成之后的文件位置: /usr/sbin/nginx&#xf…