5.2.数据结构-c/c++二叉树详解(下篇)(算法面试题)

news2024/9/20 0:49:09

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

上篇:5.数据结构-c/c++二叉树详解(上篇)(遍历方法,完全二叉树)-CSDN博客 

目录

1 求二叉树 第k层的节点

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

3 求二叉树节点的个数

4 求二叉树叶子节点的个数

5 求树的深度

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


1 求二叉树 第k层的节点

        思路:我们要求第k层结点个数,需要传入参数k。利用递归思想,我们从上到下没下一层,让k--,当k=1的时候到达第k层。

        然后我们让每一个结果返回1即可

如下图,计算第三层结点的递归图

      

函数返回值的返回图

这样就能够准确得出k层的节点数

代码

//求二叉树第k层结点的个数
int TreeKSize(BTNode* root, int k)
{
	if (root == nullptr)
		return 0;
	if (k == 1)
		return 1;
	return TreeKSize(root->left, k - 1) + TreeKSize(root->right, k - 1);
}

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

只需使用遍历方法遍历一遍同时查找即可,遍历方法详见二叉树遍历

//查找某个结点是否在二叉树中
BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if (root == nullptr)
		return nullptr;

	if (root->data == x)
		return root;

	BTNode* node1 = TreeFind(root->left, x);
	if (node1 != nullptr)
		return node1;

	BTNode* node2 = TreeFind(root->right, x);
	if (node2 != nullptr)
		return node2;
}

3 求二叉树节点的个数

有两种方法

1.遍历

//遍历
void TreeSize1(BTNode* root, int* psize)
{
	if (root == nullptr)
		return;
	else
		(*psize)++;
	TreeSize1(root->left, psize);
	TreeSize1(root->right, psize);
}

2.分治

分治的思想类似于第1题,求k个节点个数。

第一题让k层节点都返回1,最后得到答案

而这里让每一个节点都返回1,最后就能返回节点的个数

//分治
int TreeSize2(BTNode* root)
{
	if (root == nullptr)
		return 0;
	else
		return 1 + TreeSize2(root->left) + TreeSize2(root->right);
}

4 求二叉树叶子节点的个数

与第一题类似,这里只要保证返回的条件是叶子节点(左右孩子都为空的节点)

//求叶子节点个数
int TreeLeafSize(BTNode* root)
{
	if (root == nullptr)
		return 0;
	
	//保证遇到叶子节点的时候返回1
	if (root->left == nullptr && root->right == nullptr)
		return 1;
	
	//分治且其他所有节点都不返回值
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

5 求树的深度

求一棵树的深度,只要找到最深一层的结点即可

如下图,红色表示深一层结点向上返回,黑色表示其他节点返回

每一次返回的时候,返回较大的一个值即可

//求树的深度
int TreeDepth(BTNode* root)
{
	if (root == nullptr)
		return 0;
	int leftdepth = TreeDepth(root->left);
	int rightdepth = TreeDepth(root->right);

	if (leftdepth > rightdepth)
		return leftdepth + 1;
	else
		return rightdepth + 1;
}

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

        要判断一棵树是否为完全二叉树,只要判断树最后一层结点是否只集中在左侧且其他层结点都是满的。

思路:

        我们依次将所有结点放入一个队列中(如果遇到空结点也放入队列中),遇到空结点的时候退出,再判断队列中还有无结点,如果有不为空的结点,则说明该二叉树不是完全二叉树。

例图:

代码

//判断一棵树是否为完全二叉树
bool TreeComplete(BTNode* root)
{
	queue<BTNode*> q;
	//空树是完全二叉树
	if (!root)	
		return true;

	q.push(root);
	while (!q.empty())
	{
		BTNode* front = q.front();
		q.pop();

		if (front == nullptr)
			break;

		q.push(front->left);
		q.push(front->right);

	}

	//判断
	while (!q.empty())
	{
		BTNode* front = q.front();
		q.pop();

		if (front != nullptr)
			return false;
	}
	return true;
}

7 简单测试

测试代码

int main()
{
	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;


	int sizeA = 0;
	TreeSize1(A, &sizeA);
	cout << "TreeSize1:" << sizeA << endl;

	cout << "TreeSize2:" << TreeSize2(A) << endl;
	cout << "TreeLeafSize:" << TreeLeafSize(A) << endl;
	cout << "TreeDepth:" << TreeDepth(A) << endl;
	cout << "k=3 TreeKsize:" << TreeKSize(A, 3) << endl;
	if (TreeComplete(A))
		cout << "是完全二叉树" << endl;
	else
		cout << "不是完全二叉树" << endl;
	return 0;
}

测试结果

注释掉F结点

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

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

相关文章

c#笔记5 详解事件的内置类型EventHandler、windows事件在winform中的运用

为什么要研究这一问题&#xff1f; 事件和委托可以说是息息相关。 前面先解释了什么是委托&#xff0c;怎么定义一个委托以及怎么使用匿名方法来内联地新建委托。 事实上事件这一机制在c#的程序开发中展很重要的地位&#xff0c;尤其是接触了winform软件开发的同学们应该都知…

chapter12-异常(Exception)——(注解)——day14

444-异常处理入门 445-异常基本介绍 446-异常体系图 虚线代表 实现接口&#xff0c;实线代表继承 447-五大运行时异常 448-异常课堂练习 449-异常处理机制 450-tryCatch异常处理 1&#xff09;如果异常发送&#xff0c;则异常发生后面的代码不会执行&#xff0c;直接进入到Catc…

接口报错403 Forbidden 【已解决】

接口报错403 Forbidden 【已解决】 在Web开发中&#xff0c;接口请求错误是开发者经常遇到的问题之一。其中&#xff0c;403 Forbidden错误尤为常见&#xff0c;它表明服务器理解了客户端的请求&#xff0c;但是拒绝执行此请求。本文将深入探讨接口请求403 Forbidden错误&#…

iMazing 3官方中文版软件新功能全面解析,最好用的ios设备管理软件

iMazing 3是一款专为iOS设备设计的全面管理软件&#xff0c;想要更换设备的用户&#xff0c;iMazing 3的数据迁移功能能确保无缝切换。iMazing 3不仅提供了强大的备份和恢复功能&#xff0c;确保用户数据安全无虞&#xff0c;还实现了设备与电脑间的高效文件传输。无论是照片、…

浅析SVG无功补偿器在新能源发电中的应用

引言 随着新能源技术的不断进步&#xff0c;光伏发电已经崛起为未来能源发展的一个关键领域&#xff0c;各地纷纷建立起越来越多的光伏电站。然而&#xff0c;光伏发电领域仍面临诸多挑战&#xff0c;包括电网电压不稳定、发电过剩以及电压波动等问题。在这样的背景下&#xf…

《零散知识点 · Kafka 知识拓展》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)

背景需求&#xff1a; 今天有个客户购买“学号版的数感训练” 我找到文件夹&#xff0c;发现里面没有1-40号的学号数感&#xff0c;只有上学期为重4班制作的1-31号&#xff08;其中缺了1和7号&#xff09;的数感训练模版 于是用代码重新生成 【教学类-56-03】数感训练——数字…

HarmonyOS开发实战( Beta5版)Swiper高性能开发指南

背景 在应用开发中&#xff0c;Swiper 组件常用于翻页场景&#xff0c;比如&#xff1a;桌面、图库等应用。Swiper 组件滑动切换页面时&#xff0c;基于按需加载原则通常会在下一个页面将要显示时才对该页面进行加载和布局绘制&#xff0c;这个过程包括&#xff1a; 如果该页面…

学习算法需要数学知识吗?

目录 算法与数学:看似不可分割的关系常见算法中的数学元素案例分析:不需要高深数学知识的算法1. 二分查找2. 深度优先搜索 (DFS)3. 动态规划:斐波那契数列 如何在有限的数学背景下学习算法1. 专注于算法的逻辑和过程2. 可视化算法流程3. 从简单的实现开始,逐步优化4. 学习算法设…

centos7使用ifconfig查看IP,终端无ens33信息解决办法

1.问题描述 大概有十几天没用虚拟机&#xff0c;最后一次用忘记关闭虚拟机系统了&#xff1b;突然&#xff0c;发现我用远程连接工具&#xff0c;连接不上&#xff0c;去到虚拟机内部查看IP发现终端竟然没有输出enss33地址信息&#xff0c;额&#xff0c;就像下面这样。 2.解决…

android so的加载流程(Android 13~14)

序言 分析环境: Android 13~14 其实大佬 << 安卓so加载流程源码分析 >> 已经写得非常好了,我就没必要再写了 建议读者看看这篇文字,比较新,质量很高<< 安卓so加载流程源码分析 >> 为什么要分析 android so的加载流程 ??? 我想明白 so是怎么打…

无人机之反制系统篇

无人机的反制系统是一个复杂而精细的系统&#xff0c;旨在应对无人机的不当使用或潜在威胁。该系统通常由多个关键部分组成&#xff0c;包括搜索系统、光电跟踪系统、射频干扰系统及显控单元等&#xff0c;这些部分共同协作以实现对无人机的有效反制。以下是对无人机反制系统的…

SpringBoot开发——初步了解SpringBoot

文章目录 一、SpringBoot简介1、什么是Spring Boot2、Spring Boot的优点3、Spring Boot功能 二、Spring与Spring Boot对比三、Spring Boot与Spring MVC四、Spring Boot体系结构五、Springboot Initializr1、Spring Initializr2、Spring Initializr模块 一、SpringBoot简介 1、…

docker ps 得到的ports列的含义

前言 每次使用docker ps 查询容器运行情况的时候就很容易搞混ports列的含义&#xff0c;今天浅记一下 docker ps ports列含义 首先看docker ps的查询结果显示&#xff1a; CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器ID …

Axure中继器教程及案例详解

Axure RP 是一款强大的原型设计工具&#xff0c;广泛应用于产品设计、UI/UX 设计及交互设计中。中继器&#xff08;Repeater&#xff09;作为 Axure 中的一个重要元件&#xff0c;以其强大的数据处理和动态交互能力&#xff0c;成为设计师们不可或缺的工具。本文将从中继器基础…

LLM agentic模式之multi-agent: ChatDev,MetaGPT, AutoGen思路

文章目录 Multi-agentChatDev设计阶段编码阶段测试阶段文档编写 MetaGPTSOP模式下的Agent通信协议带执行反馈的迭代编程 AutoGenconversable agentsConversation ProgrammingAutoGen的应用 参考资料 Multi-agent ChatDev ChatDev出自2023年7月的论文《ChatDev: Communicative…

告别文档处理烦恼,PDF Guru Anki一键搞定所有

前言 知识就像烛光&#xff0c;能照亮一个人&#xff0c;也能照亮无数人&#xff0c;科技之光更是如此&#xff1b;这一理念深刻地影响了我们如何看待和应用新技术。正是在这样的背景下&#xff0c;一款集PDF处理与高效学习工具于一体的软件——PDF Guru Anki应运而生&#xf…

AI论文生成可靠吗?分享6款AI论文题目生成器网站

在当今学术研究和写作领域&#xff0c;AI论文题目生成器网站的出现极大地简化了学术写作流程。这些工具不仅能够帮助用户快速生成高质量的论文题目&#xff0c;还能提供文献推荐、论文润色等功能&#xff0c;从而提高写作效率和质量。以下是六款值得推荐的AI论文题目生成器网站…

glsl着色器学习(六)

准备工作已经做完&#xff0c;下面开始渲染 gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);gl.clearColor(0.5, 0.7, 1.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);gl.enable(gl.DEPTH_TEST); gl.enable(gl.CULL_FACE);设置视口 gl.viewport(0,…

轻量级的git-server工具:docker部署gogs

背景 创建一个自己使用的git server&#xff0c;让平时使用的代码之类的可以直接传到自己的服务器上&#xff0c;进行远程管理。由于一个人使用&#xff0c;gitlab 太重&#xff0c;所以选择gogs来实现功能。 系统&#xff1a;openEuler 22.03 (LTS-SP3) ip: 192.168.100.31 …