有趣的数据结构算法14——二叉树的构建

2023-11-01

每天学习一点点,我就能变成马云哥哥的打工仔!
在这里插入图片描述

什么是树

树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。其形状与树相似,具有许多分叉与分枝,它具有以下的特点:
每个结点有零个或多个子结点;
没有父结点的结点称为根结点;
每一个非根结点有且只有一个父结点;
示意图如下所示:
在这里插入图片描述

什么是二叉树

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
示意图如下所示:
在这里插入图片描述

二叉树特点

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
在这里插入图片描述
常见的二叉树种类有:完全二叉树和满二叉树。
(1)完全二叉树
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
在这里插入图片描述

(2)满二叉树除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
在这里插入图片描述

二叉树内的常用概念

孩子结点:结点的子树的根称为该结点的孩子;
双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲;
兄弟结点:同一双亲的孩子结点;
树的深度:树中最大的结点层
结点的度:结点子树的个数
树的度: 树中最大的结点的度。
叶子结点:度为 0 的结点;
分枝结点:度不为0的结点;

二叉树的实现

首先要定义二叉树的结构体,

typedef char Ele;

struct Node{
	Ele data;		//data用于存储信息
	struct Node* LeftChild;
	struct Node* RightChild;
};

typedef struct Node Node, *Tree;

Node结构体定义的二叉树中每个结点的属性,它一共具有三个元素,分别是data、LeftChild、RightChild。data用于存储信息,LeftChild用于存储左子树地址,RightChild用于存储右子树的地址。
本文为了实现的方便,将二叉树的生成也加入到初始化函数中。
其具体函数如下:

void init(Tree* t){	//当输入的字符为空格的时候,代表叶子结点
					//输入其它的字符代表当前结点的data值
					//输入顺序为当前结点、左结点、右结点。
	Ele c;
	scanf("%c", &c);
	if (' '== c){
		*t = NULL;
	}
	else{
		*t = (Tree)malloc(sizeof(Node));
		if (*t == NULL){
			printf("内存分配失败");
			exit(1);
		}
		(*t)->data = c;
		init(&(*t)->LeftChild);		//生成左结点
		init(&(*t)->RightChild);	//生成右结点
	}
}

1、当输入的字符为空格的时候,代表叶子结点
2、输入其它的字符代表当前结点的data值
3、输入顺序为当前结点、左结点、右结点。

整体实现代码

#include <stdio.h>
#include <stdlib.h>

typedef char Ele;

struct Node{
	Ele data;		//data用于存储信息
	struct Node* LeftChild;
	struct Node* RightChild;
};

typedef struct Node Node, *Tree;

void init(Tree* t){	//当输入的字符为空格的时候,代表叶子结点
					//输入其它的字符代表当前结点的data值
					//输入顺序为当前结点、左结点、右结点。
	Ele c;
	scanf("%c", &c);
	if (' '== c){
		*t = NULL;
	}
	else{
		*t = (Tree)malloc(sizeof(Node));
		if (*t == NULL){
			printf("内存分配失败");
			exit(1);
		}
		(*t)->data = c;
		init(&(*t)->LeftChild);		//生成左结点
		init(&(*t)->RightChild);	//生成右结点
	}
}


void visit(Tree t, int level){
	printf("%c位于第%d层\n", t->data, level);
}

void scan(Tree t,int level){
	if (t != NULL){
		visit(t, level);
		scan(t->LeftChild, level + 1);
		scan(t->RightChild,level + 1);
	}
}

int main(){
	Tree BiTree = NULL;
	init(&BiTree);
	scan(BiTree,1);
	return 0;
}

具体实验结果如图所示:
在这里插入图片描述
具体生成的二叉树如图所示:
在这里插入图片描述

GITHUB下载连接

https://github.com/bubbliiiing/Data-Structure-and-Algorithm

希望得到朋友们的喜欢。
有问题的朋友可以提问噢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有趣的数据结构算法14——二叉树的构建 的相关文章

  • 树莓派环境处理_一种基于树莓派的便携式的环境监测系统的制作方法

    本发明涉及通讯技术领域 尤其涉及一种基于树莓派的便携式的环境监测系统 背景技术 树莓派是尺寸仅有信用卡大小的一个小型电脑 可以将树莓派连接电视 显示器 键盘鼠标等设备使用 树莓派能替代日常桌面计算机的多种用途 包括文字处理 电子表格 媒体中
  • 论文阅读 视频生成

    T C Wang et al Video to Video Synthesis arXiv 1808 06601 cs Dec 2018 Accessed Nov 03 2020 Online Available http arxiv or
  • CTP监管评测API初始密码修改

    CTP监管评测API初始密码修改 最近在申请看穿式监管认证 我用的是开源的量化交易软件vnpy balabala找期货公司申请了认证账号 然而第一次登录必须修改密码 然而vnpy没有这个功能 网上找了几篇教程 压根不能用 但好在代码可以借鉴
  • 【vue】keep-alive清除缓存最简单暴力的方法

    项目场景 场景一 使用vue开发移动端 有ABC三个页面 点击A跳转到B 点B跳转到C 点C返回B 点B返回A 场景二 场景一实现之后 会出现这样一个问题 先从A跳转到B B页面会被缓存下来 当再从D跳转到B时 B页面并不会更新 解决方案

随机推荐

  • 我的硬盘出现I/O错误,

    用pctools去修复吧 在天空软件园里能下到 用Windows 9x启动盘启动 插入含有Pctools9 0的光盘 运行PCT90目录下的de exe 先进入 Options 菜单 选 Configuration 配置 命令 按下 空格
  • 【j2ee系列】springmvc中使用quartz,项目启动就执行某些任务

    quartz有几种执行任务的方式 至于几种我也不知道 至少有两种吧 一种是org springframework scheduling quartz CronTriggerBean方式 配置指定的时间执行一次任务 如
  • 项目经理如何分配任务

    http www 51testing com html 62 n 245962 html 记得自己第一次当PM 那是接手的项目 原来的PM 在项目需求分析做完之后 去接手另一个重要的项目去了 当时我和另外两个小组长 自然就成了接手PM的人选
  • DC-3靶机渗透实战

    0x00 信息收集 使用arp scan查看局域网内所有主机IP 定位到目标主机IP 使用nmap扫描端口服务 发现只有80端口开放 服务应该是Joomla 使用dirsearch进行路径爆破 发现administrator后台路径 访问h
  • myBatis大于1000的in查询解决办法

    之前公司一位同事写的方法
  • 笔记本安装centos之后,合上盖还正常运行设置

    修改如下配置 让其生效即可 具体操作 vim etc systemd logind conf 将上图所示 HandleLidSwitch suspend 修改为lock 并将起前面 号去掉 重启配置让其生效systemctl restart
  • IMX6学习记录(12)-通过系统接口点亮LED

    上面是我的微信和QQ群 欢迎新朋友的加入 1 硬件 硬件上 led连接的IO是GPIO5 PIN8 高电平熄灭 低电平点亮 2 export引脚 GPIO5 PIN8的在gpio上的位置是5 32 8 136 cd sys class gp
  • 大搜索时代!SEO如何挖掘关键词?方法都在这里!-搜嗖工具箱

    做SEO关键词挖掘是关键 好的关键词可以帮助您的网站在搜索引擎中获得更好的排名 要问都有哪些挖掘关键词的方法 那就太多了 下边就列举几个我常用的方式吧 方法一实用工具挖掘关键词 我们知道有很多关键词在线挖掘工具可以帮助我们快速实现关键词挖掘
  • 这款开源神器,让你能在 iPad 上随心所欲写代码!

    注意 这篇文章就是在劝你买iPad Pro 手动狗头 最近 苹果推出了新的iPad Pro 号称生产力工具 然而对程序员来说 不能写代码 就难以称得上生产力 虽然也有一些优秀的写代码App可供程序员使用 但本着能不花钱就不花钱的原则 还是可
  • epoll实现原理

    epoll的使用 epoll只有以下的三个系统函数调用 epoll create epoll ctl和epoll wait int epoll create int size 其中参数 1 size指明了生成描述符的最大范围 该函数返回一个
  • Java_.jar .war .ear区别

    jar 全称 java archive 包含 class properties文件 是文件封装的最小单元 部署文件 application client xml 级别 小 war 全称 web archive 包含 Servlet JSP页
  • es搜索引擎

    ES的优势及使用场景 ES的功能及使用简介 简介 Elaticsearch简称为ES 是一个开源的可扩展的分布式的全文检索引擎 它可以近乎实时的存储 检索数 据 本身扩展性很好 可扩展到上百台服务器 处理PB级别的数据 ES使用Java开发
  • switch删除用户显示无法连接服务器,switch无法连接互联网怎么办 NS无法联机联网详细解决办法...

    switch最经常碰到的问题是就是联网的问题 很多玩家会遇到无法联网以及联机对战的情况 那么遇到这样的问题该怎么办呢 下面就来为大家分享一下解决办法 可能的原因 网络NAT类型不是创建与其他用户的对等连接 Peer to Peer P2P
  • 软件测试相关试题知识点

    软件测试相关试题 1 下面不属于软件测试步骤的是 A 集成测试 B 回归测试 C 确认测试 D 单元测试 解析 B 回归测试是指修改旧代码后重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误 因此不是软件测试的步骤 2 Junit
  • MAC下jupyter的安装及使用

    一 安装 在终端输入以下命令 conda install jupyter notebook 运行结果如下 Collecting package metadata done Solving environment done Package P
  • date时间加减(linux,aix)

    需求是这样的 有一个在日志中的时间 格式化为 Y m d H M S格式的 那现在想比较这个时间与当前时间差值是否大于一天 这个应该怎么做呢 设计到日期的减法运算 首先先man date来看一下用法吧 DATE 1 User Command
  • java排序之快排

    这篇文章来谈谈快排 最近有一种感觉 只要有规律可循的代码 分解成为两部分以后效率就会提高很多 代码思想如下 这个代码写的是快排 快排最主要的思维就是寻找一个分界值 大的放在一边 小的放在一边 然后递归分别处理大的和小的 这里需要注意的是我们
  • 拓扑 排序

    拓扑排序的适用范围 有向无环图 DAG 实际上拓扑排序不止可以用来求拓扑序 在 D A G DAG DAG 中 我们即可以用 t o
  • c++11 智能指针 (std::shared_ptr)(一)

    定义于头文件
  • 有趣的数据结构算法14——二叉树的构建

    有趣的数据结构算法14 二叉树的构建 什么是树 什么是二叉树 二叉树特点 二叉树内的常用概念 二叉树的实现 整体实现代码 GITHUB下载连接 每天学习一点点 我就能变成马云哥哥的打工仔 什么是树 树状图是一种数据结构 它是由n n gt