day15 层序遍历 翻转二叉树 对称二叉树

题目1:102 二叉树的层序遍历

题目链接:102 二叉树的层序遍历

题意

根据二叉树的根节点root,返回其节点值的层序遍历

借助队列实现,因为队列是先进先出的逻辑,符合层序遍历一层一层遍历的思想

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;queue<TreeNode*> que;if(root!=NULL){que.push(root);while(!que.empty()){vector<int> vec;//存放每一层的结果int size = que.size();while(size--){TreeNode* node = que.front();que.pop();if(node){vec.push_back(node->val);}if(node->left){que.push(node->left);}if(node->right){que.push(node->right);}}result.push_back(vec);}}return result;}
};

题目2:226  翻转二叉树

题目链接:226 翻转二叉树

题意

根据二叉树的根节点root,翻转二叉树,将节点是左右孩子进行翻转

注意是节点指针做交换,而不是单个数值交换

首先确定遍历顺序:前序遍历 后序遍历比较直接,中序遍历得绕一下

递归法

递归三部曲

1)递归函数的参数和返回值

2)确定终止条件

3)确定单层递归逻辑

前序遍历


伪代码

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {//终止条件if(root==NULL){return root;}//单层递归逻辑,前序  中左右swap(root->left,root->right);invertTree(root->left);invertTree(root->right);return root;}
};
后序遍历

伪代码

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {//终止条件if(root==NULL){return root;}//单层递归逻辑,后序  左右中invertTree(root->left);invertTree(root->right);swap(root->left,root->right);return root;}
};
中序遍历

伪代码

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {//终止条件if(root==NULL){return root;}//单层递归逻辑,中序  左中右invertTree(root->left);swap(root->left,root->right);invertTree(root->left);return root;}
};

层次遍历

将节点的左右孩子翻转一下就可以了

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root!=NULL){que.push(root);}while(!que.empty()){int size = que.size();while(size--){TreeNode* node = que.front();que.pop();swap(node->left,node->right);if(node->left){que.push(node->left);}if(node->right){que.push(node->right);}}}return root;}
};

迭代法

前序遍历
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root!=NULL){st.push(root);}while(!st.empty()){TreeNode* node = st.top();st.pop();swap(node->left,node->right);//中if(node->right){st.push(node->right);//左}if(node->left){st.push(node->left);//右}}return root;}
};

题目3:101 对称二叉树

题目链接:101 对称二叉树

题意

根据二叉树的根节点root,检查该二叉树是否轴对称

递归法

递归三部曲  

1)递归函数的参数和返回值  (同时遍历两棵树,根节点的左子树和根节点的右子树)

2)确定终止条件

3)确定单层递归的逻辑

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool compare(TreeNode* left,TreeNode* right){//终止条件if(left!=NULL && right==NULL) return false;else if(left==NULL && right!=NULL) return false;else if(left==NULL && right==NULL) return true;else if(left->val!=right->val) return false;//一定要先判读是否为空再取值,所以先判断上面是否为空的逻辑//单层递归逻辑  后序遍历 左右中//外侧bool outside= compare(left->left,right->right);//内侧bool inside = compare(left->right,right->left);bool result = outside && inside;return result;}bool isSymmetric(TreeNode* root) {return compare(root->left,root->right);}
};

迭代法

队列

每次从队列中弹出两个元素(左子树的外侧节点与右子树的外侧节点,左子树的内侧节点与右子树的内侧节点),比较。

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {queue<TreeNode*> que;if(root!=NULL){que.push(root->left);que.push(root->right);}while(!que.empty()){TreeNode* leftnode = que.front();que.pop();TreeNode* rightnode = que.front();que.pop();if(leftnode==NULL && rightnode==NULL) continue;//遍历到叶子节点的下一层else if(leftnode!=NULL && rightnode==NULL) return false;else if(leftnode==NULL && rightnode!=NULL) return false;else if(leftnode->val!=rightnode->val) return false;else{que.push(leftnode->left);//外侧节点que.push(rightnode->right);//外侧节点que.push(leftnode->right);//内侧节点que.push(rightnode->left);//内侧节点}}return true;}
};
反例

为啥是continue 不是return true?

和队列的流程一模一样,只不过是换了一个容器而已

代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {stack<TreeNode*> st;if(root!=NULL){st.push(root->left);st.push(root->right);}while(!st.empty()){TreeNode* rightnode = st.top();st.pop();TreeNode* leftnode = st.top();st.pop();if(rightnode==NULL && leftnode==NULL) continue;else if(rightnode==NULL && leftnode!=NULL) return false;else if(rightnode!=NULL && leftnode==NULL) return false;else if(rightnode->val!=leftnode->val) return false;else{st.push(leftnode->left);//外侧节点st.push(rightnode->right);//外侧节点st.push(leftnode->right);//内侧节点st.push(rightnode->left);//内侧节点}}return true;}
};
反例

为啥是continue 不是return true?

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

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

相关文章

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载)

超详细讲解Transformers自然语言处理NLP文本分类、情感分析、垃圾邮件过滤等(附数据集下载) 什么是自然语言处理 (NLP) ? 自然语言处理 (NLP) 是计算机科学的一个分支,更具体地说,是人工智能 (AI) 的分支,旨在让计算机能够以与人类大致相同的方式理解文本和语音。 自然语…

开发代码基础

首先安装驱动&#xff0c;在ARDUINO环境下安装&#xff0c;然后安装开发板&#xff0c;详见哔哩哔哩教程 1&#xff1a;接入点模式&#xff08;也称 AP&#xff09; 通过以下示例程序&#xff0c;NodeMCU将会建立一个名为taichi-maker的WiFI。您可以使用手机或电脑连接该WiFi…

【论文阅读】Self-supervised Learning: Generative or Contrastive

Abstract 研究了在计算机视觉、自然语言处理和图形学习中用于表示的新的自监督学习方法。全面回顾了现有的实证方法&#xff0c;并根据其目的将其归纳为三大类&#xff1a;生成性、对比性和生成性对比&#xff08;对抗性&#xff09;。进一步收集了关于自我监督学习的相关理论…

Java浮点数精度问题与BigDecimal详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们在日常的Java编程中&#xff0c;经常会遇到处理金融数据的情况&#xff0c;比如计算商品的价格或者处理用户的账户余额。在这些场景下&#xff0c;精确的数值计算就显得尤为重要。这时候&#xff0c;BigDeci…

【SPDK】【NoF】使用SPDK实现NVMe over Fabrics Target

本文使用两台PC&#xff0c;一台做NVMe over Fabrics Target&#xff08;服务端&#xff09;&#xff0c;一台做NVMe over Fabrics initiator&#xff08;客户端&#xff09;。首先使用SoftRoCE来实现底层的rdma传输&#xff0c;然后使用SPDK来实现NVMe over Fabrics Target。 …

内存卡为什么会提示格式化,内存卡提示格式化还能恢复吗

对于许多电脑用户来说&#xff0c;执行内存卡格式化操作导致数据丢失是一个常见的问题。在日常生活中&#xff0c;数据丢失的情况并不少见&#xff0c;但内存卡格式化后的数据恢复相对较难。目前&#xff0c;能够使用的方法较少&#xff0c;且成功率较低&#xff0c;但并不是没…

全网快递查询工具:批量查询,提升工作效率的利器

在快递行业日新月异的今天&#xff0c;高效、准确的快递信息管理显得尤为重要。固乔快递查询助手正是一款专为快递网点设计的实用工具&#xff0c;它可以帮助您快速、批量查询全网快递单号&#xff0c;为您的网点运营带来诸多便利。 一、固乔快递查询助手的用途 批量查询&…

java: 5-3 for循环

文章目录 1. for1.1 基本语法1.2 练习1.3 执行流程1.4 细节1.5 编程思想 (练习) 【老韩b站视频笔记p121-p125】 1. for 让你的代码可以循环执行。 1.1 基本语法 for 关键字&#xff0c;表示循环控制。for 有四要素: (1)循环的初始变量。 (2)循环的条件&#xff08;变量条件&…

代码随想录算法训练营第25天 | 216.组合总和III 17.电话号码的字母组合

目录 216.组合总和III &#x1f4a1;解题思路 回溯三部曲 &#x1f4bb;实现代码 17.电话号码的字母组合 &#x1f4a1;解题思路 # 数字和字母如何映射 # 回溯法来解决n个for循环的问题 &#x1f4bb;实现代码 216.组合总和III 题目链接&#xff1a;216.组合总和III …

百家大吉·夕阳关爱——昌岗街微型养老博览会

居民热情参与博览会 为让长者了解及选择适合自己的养老服务&#xff0c;昌岗街在2023年12月27日开展以“百家大吉夕阳关爱”为主题的昌岗街微型养老服务公益博览会活动&#xff0c;通过搭建养老服务机构供需服务平台&#xff0c;拓宽社区长者了解正规养老服务机构的渠道&#…

仿真验证方法(1)——动态验证

一、概述 1.1 验证的目的和方法 在现代集成电路设计中&#xff0c;验证所占工作量超过70%。验证要求真实而完备&#xff0c;它决定了设计的成败与成本。 验证的目的 原始描述是否正确&#xff1f;&#xff08;代码&#xff09; 逻辑功能是否正确&#xff1f;&#xff08;功能…

OpenGl 19高级GLSL

一.GLSL的内建变量 在着色器中&#xff0c;需要当前着色器以外地方的数据的话&#xff0c;必须把数据传进来。之前我们是通过uniform类型和采样器来完成的。之外&#xff0c;GLSL还支持另外几个以gl为前缀的变量&#xff0c;提供更多读写数据的方式&#xff0c;比如说顶点着色…

C语言操作符详解与进制

目录 一&#xff1a;操作符的分类 二&#xff1a;二进制和进制转换 2.1 2进制转10进制 2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制 2.2.1 2进制转8进制 2.2.2 2进制转16进制 三&#xff1a; 原码、反码、补码 四&#xff1a;移位操作符 4.1左移操作符 4.2 右…

C语言指针(一)

目录 1.什么是指针 2.指针变量和地址 1.解引用操作符 2.指针变量类型的意义 3.void*指针 4.const修饰指针 1.const放在*左边 2.const放在*右边 3.指针的运算 1.指针加减整数 2.指针减指针 3.指针比较大小 4.野指针 1.没有给指针变量初始化 2.指针指向的空间释放 …

XSS的利用(包含:蓝莲花、beef-xss)

0x00、环境搭建 dvwa靶场 操作指南和最佳实践:使用 DVWA 了解如何防止网站漏洞_dvwa源代码-CSDN博客 xss漏洞接收平台 下载:GitHub - firesunCN/BlueLotus_XSSReceiver 将解压后的BlueLotus_XSSReceiver原代码放置 phpstudy 安装目录的WWW文件夹下 访问平台:http://127…

力扣刷题记录(28)LeetCode:797、200、463

797. 所有可能的路径 解题思路&#xff1a;回溯算法&#xff0c;当收集到的路径的最后一个值等于n-1时&#xff0c;收集答案。 参数&#xff1a;图、当前结点 class Solution { public:vector<int> path;vector<vector<int>> ans;void dfs(vector<vector…

企业培训系统源码:构建智能、可扩展的学习平台

企业培训系统在现代企业中扮演着至关重要的角色。本文将通过深度解析企业培训系统的源码&#xff0c;介绍如何构建一个智能、可扩展的学习平台&#xff0c;涉及关键技术和代码实例。 1. 技术栈选择与项目初始化 在构建企业培训系统之前&#xff0c;选择适当的技术栈是至关重…

Linux操作系统----实用工具Git(配实操图)

绪论​ “针对问题 解决问题 针对问题&#xff01;”&#xff0c;本章主要讲解的是Git是什么以及Git的如何搭建仓库和如何在Linux环境下通过指令的形式提交自己的代码到远程仓库。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Git的来源以…

vulnhub靶场之DC-5

一.环境搭建 1.靶场描述 DC-5 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The plan was for DC-5 to kick it up a notch, so this might not be great for beginners, but should be ok for p…

el-select 单选时,选择后输入框的is-focus状态并没有取消

前两天在封装组件的时候&#xff0c;发现el-select 单选时&#xff0c;选择后输入框的is-focus状态并没有取消&#xff0c;需要手动点其它地方才会取消&#xff0c;于是想着找找为什么 一、通过调试源码发现&#xff0c;输入框在点击选项后触发blur&#xff0c;紧接着又触发了…