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

本篇文章我们依然讲解链式二叉树的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.rhkb.cn/news/247264.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三维重建(7)--运动恢复结构SfM系统解析

目录 一、SfM系统(两视图) 1、特征提取 2、特征匹配 3、RANSAC求解基础矩阵F 4、完整的欧式结构恢复算法流程 二、基于增量法的SfM系统(以OpenMVG为例) 1、预处理 2、图像特征点提取与匹配 3、两视图重构点云 4、增加…

LPC系列一个定时器不同频率

1.背景 最近研究的LPC804里只有一个ctimer,很多时候用的捉襟见肘的,官方给了一份双匹配的参考例程,不过实际用处不大。不过我花了一晚上的时间,终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LP…

RabbitMQ(一)

1、相关概念 1.1、消息队列(MQ) MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消…

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

数据结构——链式二叉树

目录 &#x1f341;一、二叉树的遍历 &#x1f315;&#xff08;一&#xff09;、前序遍历(Preorder Traversal 亦称先序遍历) &#x1f315;&#xff08;二&#xff09;、中序遍历(Inorder Traversal) &#x1f315;&#xff08;三&#xff09;、后序遍历(Postorder Traver…

scrapy的入门使用

1 安装scrapy 命令: sudo apt-get install scrapy或者&#xff1a; pip/pip3 install scrapy2 scrapy项目开发流程 创建项目: scrapy startproject mySpider生成一个爬虫: scrapy genspider itcast itcast.cn提取数据:     根据网站结构在spider中实现数据采集相关内…

centos系统安装Ward服务器监控工具

简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…

WSL2 Debian系统添加支持SocketCAN

本人最近在使用WSL2&#xff0c;Linux系统选择的是Debian&#xff0c;用起来很不错&#xff0c;感觉可以代替VMware Player虚拟机。 但是WSL2 Debian默认不支持SocketCAN&#xff0c;这就有点坑了&#xff0c;由于本人经常要使用SocketCAN功能&#xff0c;所以决定让Debian支持…

开始学习第二十五天(番外)

今天分享一下写的小游戏啦 头文件game.h #include<stdio.h> #include<time.h> #include<stdlib.h> #define H 3 #define L 3 void InitBoard(char Board[H][L], int h, int l); void DisplayBoard(char Board[H][L], int h, int l); void playermove(cha…

【LeetCode: Z 字形变换 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

5G_RACH(一)

什么是RACH RACH 代表 Random Access Channel。这是开机时UE发给eNB的第一条消息。 为什么选择RACH &#xff1f;&#xff08;RACH 的功能是什么&#xff1f; 当你第一次听到RACH或RACH Process这个词时&#xff0c;你脑海中浮现的第一个问题是“为什么是RACH&#xff1f;”…

Windows XP x86 sp3 安装 Google Chrome 49.0.2623.112 (正式版本) (32 位)

1 下载地址&#xff1b; https://dl.google.com/release2/h8vnfiy7pvn3lxy9ehfsaxlrnnukgff8jnodrp0y21vrlem4x71lor5zzkliyh8fv3sryayu5uk5zi20ep7dwfnwr143dzxqijv/49.0.2623.112_chrome_installer.exe 2 直接 双击 49.0.2623.112_chrome_installer.exe 安装&#xff1b; 3 …

Redis6基础知识梳理~

初识NOSQL&#xff1a; NOSQL是为了解决性能问题而产生的技术&#xff0c;在最初&#xff0c;我们都是使用单体服务器架构&#xff0c;如下所示&#xff1a; 随着用户访问量大幅度提升&#xff0c;同时产生了大量的用户数据&#xff0c;单体服务器架构面对着巨大的压力 NOSQL解…

SpringBoot之JWT登录

JWT JSON Web Token&#xff08;JSON Web令牌&#xff09; 是一个开放标准(rfc7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于在各方之间以JSON对象安全地传输信息。此信息可以验证和信任&#xff0c;因为它是数字签名的。jwt可以使用秘密〈使用HNAC算法…

10. UE5 RPG使用GameEffect创建血瓶修改角色属性

前面我们通过代码实现了UI显示角色的血量和蓝量&#xff0c;并实现了初始化和在数值变动时实时更新。为了测试方便&#xff0c;没有使用GameEffect去修改角色的属性&#xff0c;而是通过代码直接修改的数值。 对于GameEffect的基础&#xff0c;这里不再讲解&#xff0c;如果需要…

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Swiper容器组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Swiper容器组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Swiper容器组件 滑块视图容器&#xff0c;提供子组件滑动轮播显示的能力。…

漏洞原理MySql注入 Windows中Sqlmap 工具的使用

漏洞原理MySql注入 SQLmap是一款开源的自动化SQL注入工具&#xff0c;用于检测和利用Web应用程序中的SQL注入漏洞。以下是SQLmap工具的使用总结&#xff1a; 安装和配置&#xff1a;首先需要下载并安装SQLmap工具。安装完成后&#xff0c;可以通过命令行界面或图形用户界面来使…

Kafka-服务端-GroupMetadataManager

GroupMetadataManager是GroupCoordinator中负责管理Consumer Group元数据以及其对应offset信息的组件。 GroupMetadataManager底层使用Offsets Topic,以消息的形式存储Consumer Group的GroupMetadata信息以及其消费的每个分区的offset,如图所示。 consumer_offsets的某Partiti…

C#算法(11)—求三个点构成圆的圆心坐标和半径

前言 我们在上位机开发领域也经常会碰到根据三个点求出圆的圆心、半径等信息的场景,本文就是详细的介绍如何根据三个点使用C#代码求出三点构成的圆的圆心坐标、圆半径、三点构成的圆弧的角度。 1、3点求圆分析 A、B、C三个点都是圆上的坐标点,过向量AB做中垂线,过向量AC做…