5.1.数据结构-c/c++二叉树详解(上篇)(遍历,几种二叉树)

news2024/11/14 18:09:36

本章所有代码请见:5.3.数据结构-c/c++二叉树代码-CSDN博客

目录

一. 二叉树的基本介绍

1.2 满二叉树

1.3 完全二叉树

1.4 搜索二叉树

1.5 平衡二叉搜索树

二. 二叉树的常用操作

2.1 二叉树的定义

2.2 创建一个新的节点

2.3 构建一颗树

2.5 销毁一棵树

三.二叉树的前序,中序,后序,层序遍历方法

3.1 前序遍历

3.2 中序遍历

3.3 后序遍历

3.4 层序遍历

四.下篇内容(算法面试题)


一. 二叉树的基本介绍

        二叉树是一种每一个节点最多只有两个子树的树结构。

树的5种基本结构如下图

几种特殊的二叉树结构

1.2 满二叉树

        二叉树的每一层是满的,节点数量为2*h-1        h为树的高度

下图两种树都为满二叉树

1.3 完全二叉树

        在一颗二叉树中,只有最后两层节点的度小于2,且所有的叶子节点都依次集中在左侧

1.4 搜索二叉树

在一颗二叉树中,该树可以为空。如果不为空,则要满足下列条件

1.树中的每一个子树的左子树都小于其根节点

2.树中每一颗子树的右子树都大于其根节点

3.所有子树都是二叉搜索树

1.5 平衡二叉搜索树

       1. 二叉搜索树的左右子树高度差不超过1

       2.左右子树都是二叉搜索树

       3.节点中包含平衡因子

满足以上三点的二叉搜索树就是平衡二叉搜索树

二. 二叉树的常用操作

2.1 二叉树的定义

//定义节点
typedef int BTDataType;

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

2.2 创建一个新的节点

//创建一个新节点
BTNode* CreatNode(int x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	assert(node);

	//更新节点的值,并将左右指针置空
	node->data = x;
	node->left = nullptr;
	node->right = nullptr;
	return node;
}

2.3 构建一颗树

	//根据需求依次构建节点并连接即可
    BTNode* A = CreatNode('A');
	BTNode* B = CreatNode('B');
	BTNode* C = CreatNode('C');
	BTNode* D = CreatNode('D');
	BTNode* E = CreatNode('E');
	BTNode* F = CreatNode('F');
	BTNode* G = CreatNode('G');


	A->left = B;
	A->right = C;
	B->left = D;
	B->right = E;
	C->left = F;
	C->right= G;

2.5 销毁一棵树

利用前序遍历,依次释放每一个节点即可

//销毁一棵树//使用后续销毁
void TreeDestory(BTNode* root)
{
	if (root == NULL)
		return;

	TreeDestory(root->left);
	TreeDestory(root->right);
	free(root);
} 

三.二叉树的前序,中序,后序,层序遍历方法

3.1 前序遍历

利用递归思想,要访问一棵树的所有节点,访问根节点后,访问子树的节点

//前序遍历
void PrevOrder(BTNode* root)
{
	if (root == nullptr)
	{
		cout << "NULL ";
		return;
	}

	cout << root->data << " ";	//访问根节点
	PrevOrder(root->left);		//访问左子树
	PrevOrder(root->right);		//访问右子树
}

3.2 中序遍历

//中序遍历
void InOrder(BTNode* root)
{
	if (root == nullptr)
	{
		cout << "NULL ";
		return;
	}
	
	//中序遍历前访问左子树,再访问根节点,最后访问右子树
	InOrder(root->left);		//访问左子树
	cout << (char)root->data << " ";	//访问根节点
	InOrder(root->right);		//访问右子树
}

3.3 后序遍历

//后序遍历
void NextOrder(BTNode* root)
{
	if (root == nullptr)
	{
		cout << "NULL ";
		return;
	}

	//后序遍历先访问左子树,在访问右子树。最后访问根节点
	NextOrder(root->left);		//访问左子树
	NextOrder(root->right);		//访问右子树
	cout << (char)root->data << " ";	//访问根节点
}

3.4 层序遍历

利用队列的先进先出特点。

将一层的节点都放入队列中,然后依次访问队首的数据并将其左右子节点放入队列中

如下图

代码 

//层序遍历(广度优先遍历),该遍历需要我们使用到队列先进先出的特点
void TreeLeverOrder(BTNode* root)
{
	if (root == nullptr)
	{
		return;
	}

	queue<BTNode*> q;
	q.push(root);
	while (!q.empty())
	{
		BTNode* front = q.front();
		if (front->left)
		{
			q.push(front->left);
		}

		if (front->right)
		{
			q.push(front->right);
		}

		cout << (char)q.front()->data << " ";
		q.pop();
	}
	cout << endl;
}

四.下篇内容(算法面试题)

求二叉树 第k层的节点

查找一个节点是否在二叉树中

求二叉树节点的个数

求二叉树叶子节点的个数

求树的深度

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

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

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

相关文章

One-Shot Imitation Learning with Invariance Matching for Robotic Manipulation

发表时间&#xff1a;5 Jun 2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2408639872513958656&noteId2408640378699078912 作者单位&#xff1a;Rutgers University Motivation&#xff1a;学习一个通用的policy&#xff0c;可以执行一组不…

Linux学习笔记6 值得一读,Linux(ubuntu)软件管理,搜索下载安装卸载全部搞定!(中)

Linux学习笔记5 值得一读&#xff0c;Linux&#xff08;ubuntu&#xff09;软件管理&#xff0c;搜索下载安装卸载全部搞定&#xff01;(上)-CSDN博客 一、前文回顾 上一篇文章我们了解了软件管理的基本概念和软件管理的几种常用工具。我们了解了软件包是由什么形式存在&#…

srt字幕文件怎么制作?分享几个简单步骤,新手必学

srt字幕文件怎么制作&#xff1f;随着短视频平台的发展&#xff0c;现在很多小伙伴喜欢用视频记录生活&#xff0c;分享美好瞬间。在将视频上传到视频平台的时候&#xff0c;我们需要对视频进行剪辑处理。而字幕的使用对提高视频内容的可理解性与传播性变得愈发重要。srt字幕文…

OpenCV 旋转矩形边界

边界矩形是用最小面积绘制的&#xff0c;所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…

基于SpringBoot+Vue的美术馆管理系统(带1w+文档)

基于SpringBootVue的美术馆管理系统(带1w文档) 基于SpringBootVue的美术馆管理系统(带1w文档) 本课题研究和开发美术馆管理系统管理系统&#xff0c;让安装在计算机上的该系统变成管理人员的小帮手&#xff0c;提高美术馆管理系统信息处理速度&#xff0c;规范美术馆管理系统信…

【高等数学学习记录】集合

1 知识点 1.1 集合的概念 集合 指具有某种特定性质的事物的总称。集合的元素 组成集合的事物称为集合的元素&#xff08;简称元&#xff09;。有限集、无限集 含有限个元素的集合&#xff0c;则称为有限集&#xff1b;反之&#xff0c;称为无限集。子集 设 A A A、 B B B是两…

HTTP Cookie 和 session

HTTP Cookie HTTP协议本身是无状态&#xff0c;无连接的。 无状态是指&#xff0c;客户每次发起请求&#xff0c;服务器都不认识客户是谁&#xff0c;它只会根据请求返回对应的资源响应。 无连接不是指TCP的无连接&#xff0c;通常指的是HTTP协议本身不在请求和响应之间维护…

哪款宠物空气净化器能更好的清理浮毛?希喂、352、IAM测评分享

家里这三只可爱的小猫咪&#xff0c;已然成为了我们生活中不可或缺的家庭成员&#xff0c;陪伴我们度过了说长不长说短不短的五年时光。时常庆幸自己当年选择养它们&#xff0c;在我失落的时候总能给我安慰&#xff0c;治愈我多时。 但这个温馨的背后也有一点小烦恼&#xff0…

使用Redis实现记录访问次数(三种方案)

目录 0. 前言1. 使用Filter实现2. 使用AOP实现 1. 导入依赖 2. 写一个切面类&#xff0c;实现统计访问次数。 3. 开启AOP 4. 测试 5. plus版本 (1) 新建一个bean类 (2) 新增一个controller方法 (3) 新增一个循环增强方法 (4) 测试…

龙芯+FreeRTOS+LVGL实战笔记(新)——04开启主任务

本专栏是笔者另一个专栏《龙芯RT-ThreadLVGL实战笔记》的姊妹篇&#xff0c;主要的区别在于实时操作系统的不同&#xff0c;章节的安排和任务的推进保持一致&#xff0c;并对源码做了改进和优化&#xff0c;各位可以先到本人主页下去浏览另一专栏的博客列表&#xff08;目前已撰…

基于OGC300工业级LORA网关与OM201L数传终端的化工厂人员定位系统解决方案

化工行业作为高风险的行业之一&#xff0c;其安全管理一直备受关注。化工生产过程中涉及到各种危险品和复杂的工艺&#xff0c;一旦发生事故&#xff0c;往往会造成严重的人员伤亡和财产损失。因此&#xff0c;化工企业急需一套可靠的安全管理系统来监测安全隐患、预防事故发生…

【2024数模国赛赛题思路公开】国赛A题思路丨附可运行代码丨无偿自提

2024年国赛A题解题思路 【题目分析】 问题1&#xff1a;舞龙队沿螺距为55 cm的等距螺线顺时针盘入&#xff0c;给出300秒内舞龙队每秒的位置和速度 分析思路&#xff1a; 螺线方程&#xff1a; 需要建立螺线方程&#xff0c;以便描述龙头及每节板凳的位置。螺线是基于极坐标系…

图形几何算法 -- 凸包算法

前言 常用凸包算法包括Graham Scan 算法和Jarvis March (Gift Wrapping) 算法&#xff0c;在这里要简单介绍的是Graham Scan 算法。 1、概念 凸包是一个点集所包围的最小的凸多边形。可以想象用一根绳子围绕着一群钉子&#xff0c;绳子所形成的轮廓便是这些钉子的凸包。在计算…

谈谈AI领域的认知误区、机会点与面临的挑战

谈谈AI领域的认知误区、机会点与面临的挑战 最近2年&#xff0c;AI 技术的火爆&#xff0c;到处都能看到大家在讨论AI 的发展与机会。这里我们讨论一下AI 认知的误区&#xff0c;机会点和面临的挑战。 by kimmking AI 认知的误区 这年头掀起了所有人讨论AI热潮的同时&#xf…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子&#xff08;Sokoban&#xff09;是一款经典的益智游戏&#xff0c;玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子&#xff0c;不能拉箱子。只能将箱子推到…

【内容审核】对审核结果进行封装

目录 1、分析返回结果示例 2、自定义封装类 在【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能&#xff0c;但是这些功能灵活性不够&#xff0c;既不能自己设置审核的强度&#xff0c;也不能内容违规的详细信息&#xff…

【教学类-52-08】20240905动物数独(6宫格)一页2张任务卡,一页一个动物贴图卡,有答案

背景需求&#xff1a; 前文提到6宫格数独的图片6*636图&#xff0c;如果将6张任务卡放在一个A4上&#xff0c;看上去6种动物很小&#xff0c;所以我换了一个word模板&#xff0c;变成了2张任务卡放在一个A4上。 【教学类-52-07】20240903动物数独&#xff08;6宫格&#xff0…

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

003: Visual Studio 配置 VTK 开发环境的方法与比较

目录 简介&#xff1a; 1 配置属性方法&#xff1a; 2 创建配置文件 3 在新项目中导入props文件 总结&#xff1a; 简介&#xff1a; 编译好VTK后&#xff0c;在安装目录里面有通常有包含bin,lib和include等文件夹&#xff0c;要在自己的项目里面使用VTK&#xff0c;主要…

如何用c++判断一个类型是vector

如何用c判断一个类型是vector 我们使用模板元编程来搞定 这里我们可以定义一个模板结构体 is_std_vector&#xff0c;并对其进行特化&#xff0c;以便专门处理 std::vector 类型。 . 下面是详细的实现和使用示例。 实现 is_std_vector 类型, 继承自false_type 首先&#xff…