数据结构——链式二叉树(3)

news2024/11/26 17:49:32

本篇文章我们依然讲解链式二叉树的OJ题;

一、二叉树的层序遍历

层序遍历即从根节点开始一层一层的遍历。我们可以运用队列的先进先出特性实现!

//层序遍历
void a(BTNode* root)
{
	Que qhead;
	Queueinit(&qhead);
	//先入队根节点
	if(root)
	QueuePush(&qhead, root);

	while (!QueueEmpty(&qhead))
	{
		BTNode* tmp = QueueFront(&qhead);
		printf("%d ", tmp->val);
		if (tmp->left != NULL)
		{
			QueuePush(&qhead, tmp->left);
		}
		if (tmp->right != NULL)
		{
			QueuePush(&qhead, tmp->right);
		}
		QueuePop(&qhead);

	}

	QueueDestroy(&qhead);
}

①:由代码可知,我们先初始化一个队列,然后将根节点入队,这里队列的每个结点类型都为树的指针(即树的结点);

②:用while循环对队列进行遍历,其中注意在打印完队头数据后,我们需要判断队头的左右子树是否为NULL,若不为空,则分别将左右子树入队;

③最后出队,找到下一个树的结点;

二、判断一颗树是不是二叉树

想要判断一颗树是不是二叉树,我们就要找找二叉树的特点,当我们画出一颗二叉树观察可以知道,当一颗二叉树通过层次遍历得到的顺序中,非空结点是连续的;

所以我们有如下规律:

①:通过层次遍历,若非空节点是连续的,则是二叉树;

②:通过层次遍历,若非空节点不连续,则不是二叉树;

代码实现如下:

//判断一颗树是不是二叉树
int TreeComplete(BTNode* root)
{
	Que qhead;
	Queueinit(&qhead);
	//先入队根节点
	if (root)
		QueuePush(&qhead, root);
	//根据层序遍历思路入队,遇到NULL,则停止入队
	while (!QueueEmpty(&qhead))
	{
		BTNode* tmp = QueueFront(&qhead);
		if (tmp == NULL)
			break;
		QueuePush(&qhead, tmp->left);
		QueuePush(&qhead, tmp->right);
		QueuePop(&qhead);
	}

	//看队列的后面还有没有非空节点,若有的话,则不是二叉树
	while (!QueueEmpty(&qhead))
	{
		BTNode* tmp = QueueFront(&qhead);
		QueuePop(&qhead);
		if (tmp != NULL)
		{
			QueueDestroy(&qhead);
			return 0;
		}
		/*QueuePush(&qhead, tmp->left);
		QueuePush(&qhead, tmp->right);*/
	}
	return 1;

	QueueDestroy(&qhead);
}

①:由代码可知,层次遍历的思路和第一题一样,只是因为我们要通过非空节点是否连续来判断,所以此时遇到左右孩子为NULL时,也要将其入队;

②:当第一次遍历到队头为NULL时,则停止入队;然后又遍历剩余的队列,看是否存在非空节点,若存在,则不是二叉树,返回0;若不存在,则是二叉树,返回1;

三、LeetCode——判断一颗树是不是另一颗树的子树

(一)、题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

(二)、解答

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}


bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL)
    return false;
    if(root->val==subRoot->val)
    {
        if (isSameTree(root,subRoot))
        return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);

}

①,要判断子树,很显然要用到判断树是否相同的原理,所以我们将之前写的“判断树相同”的的代码直接搬运过来;

②:题目规定子树subRoot不可能为NULL,所以我们先判断大树root是否为NULL,若为NULL,则直接返回false;

③:然后我们知道,只有根节点的值相等,这两棵树才有可能相同,所以先判断结点的值,若找到两个相等的结点,则调用“判断树是否相同”函数进行判断,若相等则返回true,代表是子树;若不相等,则大树继续向下找(先找左子树,然后找右子树);

四、LeetCode——反转二叉树

(一)、题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

(二)、解答


 //手写函数
void _invertTree(struct TreeNode* root1,struct TreeNode* root2)
{
    //为NULL则返回
    if(root1==NULL||root2==NULL)
    return ;
    //交换根节点
    int tmp = root1->val;
    root1->val = root2->val;
    root2->val = tmp;
    //找子树
    _invertTree(root1->left,root2->right);
    _invertTree(root1->right,root2->left);

}

//题目给定函数
struct TreeNode* invertTree(struct TreeNode* root) {
    if(root)
    _invertTree(root->left,root->right);
    return root;
}

①:根据题意,我们可以把一棵树root分为两棵树root1和root2,并且由图可以看到,只需要将两棵树的根节点的值进行交换,然后root1递归到其右子树的同时root2递归到其左子树;root1递归到其左子树的同时,root2递归到其右子树,接着依次交换顺序即可,直到最后都为NULL则返回;

五、LeetCode——判断一棵树是不是对称二叉树(镜像对称)

(一)、题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

(二)、解答

bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
{
    if(root1==NULL&&root2==NULL)
    return true;
    if(root1==NULL||root2==NULL)
    return false;
    if(root1->val!=root2->val)
    return false;
    return _isSymmetric(root1->left,root2->right)
        && _isSymmetric(root1->right,root2->left);
}

bool isSymmetric(struct TreeNode* root) {
   return _isSymmetric(root->left,root->right);
}

①:思路也是参考上面几道体,既然要判断是不是镜像对称,我们就可以将一颗大树对半分成两棵树,然后观察图片可知,root1的右子树要等于root2的左子树;root1的左子树要等于root2的右子树,所以将根节点比较完后就可以给出相应递归。

本次知识到此结束,希望对你有所帮助!

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

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

相关文章

C#,计算几何,随机点集之三角剖分的德劳内(Delaunay)算法的源代码

一、三角剖分Delaunay算法简介 点集的三角剖分(Triangulation),对数值分析(比如有限元分析)以及图形学来说,都是极为重要的一项预处理技术。尤其是Delaunay三角剖分,由于其独特性,关…

LeetCode: 160.相交链表(令人赞叹的优雅)

160. 相交链表 - 力扣(LeetCode) 目录 官方双指针解法: 博主的辣眼代码: 每日一表情包: 博主还未学习哈希表,所以介绍的是双指针法,此题的哈希表解法时O(nm)空O&…

MySQL窗口函数--lead()函数

lead()函数: 查询当前行向下偏移n行对应的结果 该函数有三个参数:第一个为待查询的参数列名,第二个为向下偏移的位数,第三个参数为超出最下面边界的默认值。 如下代码: 查询向下偏移 2 位的年龄 SELECT user_id,user…

JavaScript高级:深浅拷贝

目录 1 引言 2 浅拷贝 2.1 拷贝数组 1.2 拷贝对象 3 赋值操作和浅拷贝的比较 4 深拷贝 4.1 前置知识 --> 递归函数 4.2 使用递归实现深拷贝 4.3 js库中的lodash里面的cloneDeep内部实现深拷贝 4.4 利用JSON实现深拷贝 深浅拷贝只针对引用数据类型 1 引言 假如我们…

leetcode 19 , 118

19 .删除链表倒数第n个节点 思路1: 我首先想到的就是使用两个loop来进行解决: 遍历所有节点,得到需要删除节点的位置。再遍历一边所有节点,找到需要删除节点进行删除。 解决方案1: class Solution {public ListNod…

DevOps落地笔记-07|案例分析:如何有效管理第三方组件

上一讲主要介绍了如何通过代码预检查的方式提高入库代码的质量,将代码检查尽可能前置,降低修复问题的成本,从而提高交付软件的质量。除了代码本身的问题,依赖组件也是经常困扰开发者的一个问题。比如,依赖组件的某个版…

项目管理构建不只是Maven,还有更优越的它!

教程全文阅读请转至《项目管理构建不只是Maven,还有更优越的它!》 Gradle简介 Gradle是一种现代化的构建工具,用于构建Java、C、Python、Android等项目。它是一种基于Groovy语言的自动化构建工具,可以自动化执行各种构建任务,例…

matlab基本操作

目录 1 清空workspace 2 清空命令行窗口 3 求字符的ASCII码 4 矩阵的表示 5 矩阵的转置 6 按列输出 7 求逆矩阵 8 创建零矩阵 9 生成随机数 10 生成空数组 11 生成单位矩阵 12 生成幻方矩阵 13 结构体 14 重复 15 点乘与叉乘 16 寻找符合条件的元素…

2024年1月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先,来看下效果图 在线体验地址:https://geojson.hxkj.vip,并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

spring cache的使用(Redis)

要在Spring Boot应用中使用Redis作为缓存,你需要遵循一些步骤来配置和使用Redis。以下是使用Spring Cache抽象与Redis进行整合的详细说明: 1. 添加依赖 首先,需要在pom.xml中添加Spring Boot的Redis starter依赖以及缓存的starter依赖。这会…

vivado 与系统设计师接口

与系统设计师接口 作为迭代I/O和时钟规划过程的一部分,您可以交换有关AMD设备通过导出CSV文件和IBIS模型,与PCB或系统设计者进行引脚连接。根据PCB或设计规范的变化,您可能需要将引脚重新导入为如定义和配置I/O端口中所述。完成I/O和时钟中的…

如何在 Mac 中运行 Office 办公软件

虽然 Office 软件也有 Mac 版本的,但是有蛮多小伙伴用起来还是感觉不得劲,毕竟接触了太久的 Windows,所以想要使用 Windows 版本的 Office 软件。 今天就给大家介绍一下怎么在 Mac 电脑中运行 Windows 版本的办公软件,在这里就需…

【Qt】—— Qt Creator 创建项目

目录 (一)Qt Creator概览 (二)使⽤Qt Creator新建项⽬ (一)Qt Creator概览 从开始菜单或者快捷⽅式打开Qt Creator集成开发环境,启动之后看到类似下⾯的界⾯: 【解释说明】 菜单栏…

0101appscan安装与使用入门-扫描-信息收集

1 简介 HCL AppScan(原IBM Security AppScan)是原IBM的Rational软件部门的一组网络安全测试和监控工具,2019年被HCL技术公司收购。AppScan旨在在开发过程中对Web应用程序的安全漏洞进行测试[1]。该产品学习每个应用程序的行为,无…

杂题——试题-算法训练-P0604-runaround数

分析: 题目有三个关键点: 一:结束时,回到起始位置(比较结束时和起始时的下标位置是否相同)二:该整数的所有数字都必须遍历一遍,且只能遍历一遍(把遍历过的数字做个标记&a…

牛客,OR36 链表的回文结构,快慢指针和反转链表的实践

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 还是比较简单的,主要分为三个步骤,两种需掌握的函数实现 目录 主要思路过程,1,找到中间结点,2,反转中间结点往后的结点,3,遍历比…

如何将AI智能监控应用在物业中打造智慧物业系统

方案背景 随着视频智能化发展,仅靠人力管理的传统物业已然成为历史,为了降低人工成本,实现精细化管理,人工智能的帮助必不可少,旭帆科技AI智能监控系统在物业中可以用于打造智慧物业系统,提升物业管理的效…

MacBook安装虚拟机VMware Fusion

MacBook安装虚拟机VMware Fusion 官方下载地址: https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_fusion/11_0 介绍 之前的版本都要收费,现在出了对个人免费的版本, 棋哥给的破解版的版本是8,升级系统后用不了了. 官方去下载…

VR全景技术如何运用在文旅展示,VR全景技术对景区有哪些好处

引言: 随着科技的不断进步和社会的不断发展,VR全景技术越来越受到人们的关注。在文化旅游行业中,VR全景技术的应用为景区提供了全新的展示方式和体验内容,极大地丰富了游客的文化旅游体验。那么VR全景技术能给文旅展示带来哪些好…

AI的安全应答之道

作者:统信UOS技术团队 2023,随着各种大语言模型的爆发,整个AI生态正处于从决策式AI进化到生成式AI的进程中。各类AI模型和AI应用层出不穷,也随之带来了与AI相关的各类潜在风险。AI开发和使用过程中的风险防范和治理,成为了不可忽…