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

devtools/2024/9/25 2:33:36/

题目描述

题目链接
给你一棵二叉树的根节点 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/devtools/14829.html

相关文章

ORAN每个端点和每个C平面消息的限制

O-RU每个端点的处理限制 当O-RU的处理粒度是基于端点的&#xff0c;即&#xff0c;在O-RU中处理C/U平面消息的处理资源被分配给每个端点时&#xff0c;O-RU可以对每个端点施加特定限制&#xff0c;例如&#xff0c;endpoint-section-capacity、endpoint-beam-capacity、endpoi…

Linux-缓冲区(简单理解)

1. 缓冲区是什么 缓冲区就是一段内存空间。 2. 为什么要有缓冲区 IO写入有两种&#xff1a; 写透模式&#xff08;WT&#xff09; 成本高&#xff0c;效率低写回模式&#xff08;WB&#xff09; 成本低&#xff0c;效率高 写透模式&#xff1a;每次的文件写入都要立即刷新…

OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

libevent主要是用C语言实现了事件通知的功能 下载安装 直接在OpenHarmony-SIG仓中搜索libevent并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libevent 修改添加依赖的编译脚本 在/developtools/bytrace_standard/…

伴游平台搭建重点,会用到哪些三方服务?

伴游平台搭建的重点在于确保用户的安全与体验&#xff0c;提供便捷的服务&#xff0c;同时维护平台的稳定运营。在搭建过程中&#xff0c;可能会用到以下三方服务&#xff1a; 身份验证与背景调查服务&#xff1a;由于伴游服务涉及到用户的个人安全和信任问题&#xff0c;因此需…

Android - OkHttp 访问 https 的怪问题

一、简述 最近使用 OkHttp 访问 https 请求时,在个别 Android 设备上遇到了几个问题,搜罗网上资料,经过一番实践后,问题得到了解决,同时,我也同步升级了我的 https 证书忽略库 ANoSSL ,在此,对搜集到的资料和问题解决方案做个记录。 文章中的代码实现可到 GitHub 仓库…

在ios设备上运行Unity Profiler

久违了朋友们。 最近基于Unity 2021.3 和AR Foundation开发了个应用&#xff0c;需要在ipad上实际运行时查看程序的各项指标功耗。 于是乎&#xff0c;我尝试跟随者官方教程来实时调试&#xff0c;现在附上一些心得。 按照官方的三步走&#xff0c;Build and Run理论上会自动…

添加修改ubuntu中环境变量(PATH)

1.打开.bashrc文件进行设置&#xff0c;终端执行以下命令&#xff1a; sudo gedit ~/.bashrc2.在末尾行添加&#xff1a; export PATH$PATH:/xxx/xxx 其中&#xff0c;$PATH代表现存的环境变量&#xff0c;不能省去&#xff0c;等号两边一定不能有空格&#xff0c;/xxx/xxx要…

加密安全-openssh服务

openssh服务 1、ssh配置 ssh第一次远程链接需要客户端输入yes&#xff0c;如下&#xff1a; # 109节点第一次通过ssh链接106&#xff0c;需要手动输入yes root109:~$ ssh 192.168.31.106 The authenticity of host 192.168.31.106 (192.168.31.106) cant be established. ED…