【数据结构】树形结构--二叉树(二)

news2025/6/8 5:08:06

【数据结构】树形结构--二叉树(二)

  • 一.二叉树的实现
    • 1.求二叉树结点的个数
    • 2.求二叉树叶子结点的个数
    • 3.求二叉树第k层结点的个数
    • 4.求二叉树的深度(高度)
    • 5.在二叉树中查找值为x的结点
    • 6.判断二叉树是否为完全二叉树
    • 7.二叉树的销毁

一.二叉树的实现

二叉树的介绍以及各种遍历在上篇文章有讲,可以先回顾一下再继续后面的学习 【数据结构】树形结构–二叉树。

1.求二叉树结点的个数

二叉树结点个数即:左子树结点个数加上右子树结点个数再加上根结点,这里就用到了分治思想和递归。

分治思想:
①分解:将一个大问题拆解成多个相似的子问题。
②解决:递归解决子问题,子问题足够小时,直接解决。
③合并:将子问题的解合并得到大问题的解。

因此当结点为空时直接返回0,然后递归计算左子树的结点,加上递归计算出的右子树的结点,再加上根结点的个数,即为二叉树的结点个数。
代码实现为:

//求二叉树结点个数
//分治思想
int BinaryTreeSize(BTNode* root)
{
	//采用三目表达式,结点为空直接返回,否则递归计算左右子树个数及根结点。
	return root == NULL ? 0 : BinaryTreeSize(root->leftchild) + BinaryTreeSize(root->rightchild) + 1;
}

2.求二叉树叶子结点的个数

求二叉树的叶子结点个数需要先判断是否为叶子结点,即没有左、右孩子的结点,满足条件则返回1,不满足返回0,然后递归计算左子树叶子结点个数和右子树叶子结点个数。
代码实现为:

//求二叉树叶子结点个数
int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->leftchild==NULL&&root->rightchild==NULL)
		return 1;

	return BinaryTreeLeafSize(root->leftchild) + BinaryTreeLeafSize(root->rightchild);
}

3.求二叉树第k层结点的个数

在求二叉树第k层结点个数时,形参除了传二叉树根结点,还需要传k的值,这样在函数中递归进入下一层时,再将k-1作为参数传递。
当k等于1且结点不为空时,当前层数即为第k层,返回1,同时使用分治思想计算左子树第k层结点个数和右子树结点个数,最后得到第k层结点个数。
代码实现为:

//求二叉树第k层结点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
		return 0;

	if (k == 1)
		return 1;

	return BinaryTreeLevelKSize(root->leftchild, k-1) + BinaryTreeLevelKSize(root->rightchild, k-1);
}

4.求二叉树的深度(高度)

二叉树的深度是左、右子树中深度最大的那个,因此可以先递归计算出左子树的高度和右子树的高度,较大的高度再加上1(根结点),即为二叉树的高度。
代码实现为:

//求二叉树的深度(高度)
int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
		return 0;

	int leftdepth = BinaryTreeDepth(root->leftchild);
	int rightdepth = BinaryTreeDepth(root->rightchild);
	return leftdepth > rightdepth ? leftdepth + 1 : rightdepth + 1;
}

5.在二叉树中查找值为x的结点

可以借助前、中、后序遍历或层序遍历的方式依次遍历所有结点的值,若结点值为x,则返回该结点,若遍历完不存在值为x的结点,则返回空。
代码实现为:

//在二叉树中查找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;

	BTNode* left = BinaryTreeFind(root->leftchild,x);
	if (left)
		return left;

	BTNode* right = BinaryTreeFind(root->rightchild,x);
	if (right)
		return right;

	return NULL;
}

6.判断二叉树是否为完全二叉树

判断二叉树是否为完全二叉树需要先了解完全二叉树的特点。
完全二叉树的定义是:除最后一层外,其余各层都是满的,并且最后一层的节点都集中在最左边。
因此可以借助队列层序遍历二叉树,循环将二叉树的结点入队列、出队列,当出队列的结点为空时停止循环,然后再循环出队列判断,若所有结点都出队列前遇到非空结点,则不是完全二叉树,否则是完全二叉树。
示意图:
在这里插入图片描述
代码实现为:

//判断二叉树是否为完全二叉树
bool BinaryTreeComplete(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	if (root == NULL)
		return true;
	QueuePush(&q,root);
	while (QueueSize(&q))
	{
		BTNode* tmp = QueueFront(&q);
		QueuePop(&q);
		if (tmp == NULL)
			break;

		QueuePush(&q,tmp->leftchild);
		QueuePush(&q, tmp->rightchild);
	}
	while (QueueSize(&q))
	{
		BTNode* tmp = QueueFront(&q);
		if (tmp != NULL)
			return false;
	}
	return true;
}

7.二叉树的销毁

二叉树的销毁需要根据左->右->根的顺序递归销毁每个结点,否则根结点在左、右孩子之前销毁的话就找不到左右结点了。
代码实现为:

//二叉树的销毁
void BinaryTreeDestory(BTNode** root)
{
	//根据 左->右->根 的顺序销毁二叉树
	if (*root == NULL)
		return;

	 BinaryTreeDestory(&(*root)->leftchild);
	 BinaryTreeDestory(&(*root)->rightchild);
	
	free(*root);
	*root = NULL;

}

二叉树的链式实现和各个操作就先讲到这里,感谢阅读!^ _ ^在这里插入图片描述

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

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

相关文章

深度学习题目1

梯度下降法的正确步骤是什么? a.计算预测值和真实值之间的误差 b.重复迭代,直至得到网络权重的最佳值 c.把输入传入网络,得到输出值 d.用随机值初始化权重和偏差 e.对每一个产生误差的神经元,调整相应的(权重&#xff…

【Oracle】锁

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 锁基础概述1.1 锁的概念与作用1.2 锁的工作原理1.3 Oracle锁的分类 2. 行级锁 (Row-Level Locks)2.1 行级锁的基本概念2.1.1 TX锁(事务锁)2.1.2 行级锁的工作机制 2.2 行级锁的类型2.…

JS逆向爬虫教程与实战技巧

想要一个关于爬虫JS逆向的详细教程。这是一个很专业的技术需求,最近有个可能是正在学习爬虫技术的开发者或者数据分析师,遇到了需要破解JavaScript加密的反爬机制的问题,想让我出一期实战教程,话不多说,开干。 以下是我…

【Redis】Redis 的常见客户端汇总

目录 一、命令行客户端 二、图形界面的客户端 三、Java 客户端 3.1 SpringDataRedis 3.2 Jedis 3.2.1 连接池的配置 3.3 Lettuce 3.3.1 RedisTemplate 工具类实现 3.3.2 自定义序列化器 3.3.3 StringRedisTemplate 3.3.4 集群配置 3.3.4.1 刷新节点集群拓扑动态感应…

关于akka官方quickstart示例程序(scala)的记录

参考资料 https://doc.akka.io/libraries/akka-core/current/typed/actors.html#first-example 关于scala语法的注意事项 extends App是个语法糖,等同于直接在伴生对象中编写main 方法对象是通过apply方法创建的,也可以通过对象的名称单独创建&#x…

2025年渗透测试面试题总结-腾讯[实习]玄武实验室-安全工程师(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]玄武实验室-安全工程师 1. 自我介绍 2. CSRF原理 3. Web安全入门时间 4. 学习Web安全的原因 …

网站首页菜单两种布局vue+elementui顶部和左侧栏导航

顶部菜单实现 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue.js Element UI 路由导航</…

@Builder的用法

Builder 是 Lombok 提供的一个注解&#xff0c;用于简化 Java 中构建对象的方式&#xff08;Builder 模式&#xff09;。它可以让你以更加简洁、链式的方式来创建对象&#xff0c;尤其适用于构造参数较多或部分可选的类。

vue实现点击按钮input保持聚焦状态

主要功能&#xff1a; 点击"停顿"按钮切换对话框显示状态输入框聚焦时保持状态点击对话框外的区域自动关闭 以下是代码版本&#xff1a; <template><div class"input-container"><el-inputv-model"input"style"width: 2…

[蓝桥杯]取球博弈

取球博弈 题目描述 两个人玩取球的游戏。 一共有 NN 个球&#xff0c;每人轮流取球&#xff0c;每次可取集合 n1,n2,n3n1​,n2​,n3​中的任何一个数目。 如果无法继续取球&#xff0c;则游戏结束。 此时&#xff0c;持有奇数个球的一方获胜。 如果两人都是奇数&#xff…

[Java 基础]数组

什么是数组&#xff1f;想象一下&#xff0c;你需要存储 5 个学生的考试成绩。你可以声明 5 个不同的 int 变量&#xff0c;但这会显得很笨拙。数组提供了一种更简洁、更有组织的方式来存储和管理这些数据。 数组可以看作是相同类型元素的集合&#xff0c;这些元素在内存中是连…

‘pnpm‘ 不是内部或外部命令,也不是可运行的程序

npm install -g pnpm changed 1 package in 4s 1 package is looking for funding run npm fund for details C:\Users\gang>pnpm pnpm 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 原来是安装的全局路径被我改了 npm list -g --depth 0 把上述…

Android Test2 获取系统android id

Android Test2 获取系统 android id 这篇文章针对一个常用的功能做一个测试。 在项目中&#xff0c;时常会遇到的一个需求就是&#xff1a;一台设备的唯一标识值。然后&#xff0c;在网络请求中将这个识别值传送到后端服务器&#xff0c;用作后端数据查询的条件。Android 设备…

webpack打包学习

vue开发 现在项目里安装vue&#xff1a; npm install vue vue的文件后缀是.vue webpack不认识vue的话就接着安插件 npm install vue-loader -D 这是.vue文件&#xff1a; <template> <div><h2 class"title">{{title}}</h2><p cla…

基于Java(Jsp+servelet+Javabean)+MySQL实现图书管理系统

图书管理系统 一、需求分析 1.1 功能描述 1.1.1“读者”功能 1&#xff09;图书的查询&#xff1a;图书的查询可以通过搜索图书 id、书名、作者名、出版社来实现,显示结果中需要包括书籍信息以及是否被借阅的情况&#xff1b; 2&#xff09;图书的借阅&#xff1a;借阅图书…

服务器CPU被WMI Provider Host系统进程占用过高,导致系统偶尔卡顿的排查处理方案

问题现状 最近一个项目遇到一个非常奇葩的问题&#xff1a;正式服务器被一个WMI Provider Host的系统进程占用大量的CPU资源&#xff0c;导致我们的系统偶尔卡顿 任务管理器-详细信息中CPU时间&#xff0c;这个进程也是占用最多的 接口时不时慢很多 但单独访问我们的接口又正…

JavaSwing之--JMenuBar

Java Swing之–JMenuBar(菜单栏) JMenuBar是 Java Swing 库中的一个组件&#xff0c;用于创建菜单栏&#xff0c;通常位于窗口的顶部。它是菜单系统的容器&#xff0c;用于组织和显示应用程序的菜单结构 菜单栏由菜单构成&#xff0c;菜单由菜单项或子菜单构成&#xff0c;也…

【物联网-S7Comm协议】

物联网-S7Comm协议 ■ 调试工具■ S7协议-简介■ S7协议和modbusTCP协议区别■ OSI 层 S7 协议■ S7协议数据结构 &#xff08;TPKTCOTPS7Comm&#xff09;■ TPKT&#xff08;第五层&#xff1a;会话层&#xff09; 总共占4个字节■ COTP&#xff08;第六层&#xff1a;表示层…

数据分析后台设计指南:实战案例解析与5大设计要点总结

引言 数据于企业而言异常重要&#xff0c;企业通过数据可以优化战略决策&#xff0c;因此企业对数据的采集正趋向智能化、数字化&#xff0c;数据分析后台就是企业智能化、数字化记录、分析数据的渠道。本文分享一个数据分析后台原型实战案例&#xff0c;通过页面拆解总结原型…

网络测试实战:金融数据传输的生死时速

阅读原文 7.4 网络测试实战--数据传输&#xff1a;当毫秒决定百万盈亏 你的交易指令为何总是慢人一步&#xff1f; 在2020年"原油宝"事件中&#xff0c;中行原油宝产品因为数据传输延迟导致客户未能及时平仓&#xff0c;最终亏损超过90亿元。这个血淋淋的案例揭示了…