【二叉树算法题记录】226. 翻转二叉树

server/2024/9/24 12:33:10/

题目描述

题目链接
给你一棵二叉树的根节点 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;swap(root->left, root->right);  // 首先进行左右孩子的交换invertTree(root->left); // 递归翻转左子树invertTree(root->right); // 递归翻转右子树return root;}
};

迭代

广度优先遍历

迭代法我用的是层序遍历(广度优先遍历)。和层序遍历法的写法一样,也是用队列que来存放每一层节点,然后对该层节点进行左右孩子的翻转,并且每完成一次翻转,就将它的左右孩子节点也放进队伍后面,等待下一层的翻转。这里我们用一个int size在每一层操作的开始记录该层节点的数量。代码如下:

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();if(node->left || node->right){TreeNode* temp = node->left;node->left = node->right;node->right = temp;}if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return root;}
};

深度优先遍历

这里也给出深度优先遍历的答案:

class Solution {
public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;stack<TreeNode*> st;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;}
};

实际上和广度的区别在于它用的是深度优先遍历需要先进后出,我们处理完一个根节点(交换它的左右孩子),紧接着就要处理它的左子树和右子树,处理路线是纵向。而广度是处理兄弟姐妹堂表,处理路线是横向


http://www.ppmy.cn/server/14614.html

相关文章

算法课程笔记——蓝桥云课第三次直播

对拍 随机数生成器 也可以设计成时间 每次填一个不同的数&#xff08;C11&#xff09; 输出到文件 Main--自己的代码 Std---标准答案 头文件 每次改这个 &#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 一…

企业微信hook接口协议,ipad协议http,外部联系人图片视频文件下载

外部联系人文件下载 参数名必选类型说明file_id是StringCDNkeyopenim_cdn_authkey是String认证keyaes_key是Stringaes_keysize是int文件大小 请求示例 {"url": "https://imunion.weixin.qq.com/cgi-bin/mmae-bin/tpdownloadmedia?paramv1_e80c6c6c0cxxxx3544d9…

学习Django

1.python安装是会有几个主要目录&#xff1a; 2.如果某个路径加入了环境变量&#xff0c;那么在命令行直接输入他下面的文件就能找到&#xff0c;不用输入完整路径 2.过程 &#xff08;1&#xff09;安装 &#xff08;2&#xff09;建项目 在终端&#xff1a; &#xff08;…

T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件

大家好&#xff0c;我叫秋意零。 最近对公司进行日常运维工作时&#xff0c;出现了一个 T1 级别事故。导致公司的“酒云网”APP的无法使用。我和我领导一起搞了一个多小时&#xff0c;业务也停了一个多小时。 起因是&#xff1a;我的部门直系领导&#xff0c;叫我**删除一个 …

动态规划---斐波那契数列模型

目录 一、斐波那契数列的基本概念 二、动态规划在斐波那契数列中的应用与优势 三、实际案例&#xff1a;使用动态规划解决斐波那契数列问题 四、动态规划问题的做题步骤 五、例题 1、第N个泰波那契数---点击跳转题目 2、三步问题----点击跳转题目 3、最小花费爬楼梯---…

深入浅出MySQL-03-【MySQL中的运算符】

前言 环境&#xff1a; Windows11MySQL-8.0.35 MySQL支持多种类型的运算符&#xff0c;可以用来连接表达式的项。运算符的类型主要包括 算术运算符、比较运算符、逻辑运算符 和 位运算符。 1.算术运算符 算术运算符包括 加、减、乘、除 和 模 运算符。 运算符作用加法-减…

ctfshow——XSS

文章目录 XSS介绍什么是xss&#xff1f;XSS危害XSS的分类常用XSSpayload web316——反射型XSSweb317——过滤<script> web318——过滤script、imgweb319——不止过滤script、imgweb320——过滤空格web321——不止过滤空格web322——不止过滤空格web323web324web 325web32…

OpenInventor/Coin3D 学习指南

简介 Coin3D是OpenInventor规范/API的开源实现&#xff0c;它提供了丰富的资源供学习OpenInventor编程&#xff0c;并以更为宽松的LGPL许可证发布。 重要类别 包括基本类型&#xff08;如向量、矩阵等&#xff09;、大多数对象的基类、用于运行时类型检查的类、字段和字段容…