力扣周赛 313 反转二叉树的奇数层(dfs镜像遍历 or bfs提取层节点)

article/2025/9/4 22:27:17

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题意:

对于一颗给定的二叉树,我们的任务是反转它的所有奇数层的节点的权值 val(根节点所在层为第 0 层),操作完后返回根节点 root。

思路:

思路一:

dfs 镜像遍历:左子树按照左中右的顺序遍历 右子树按照右中左的顺序遍历

当遍历到 奇数层 的时候,根据镜像遍历的特点,可以发现:当前遍历的两个点就是需要对换的两个点,直接对换即可。

思路二:

bfs 提取遍历过程中的 各层的节点,如果当前层是 奇数层,则反转节点权值即可。

思路二的实现较为巧妙,具体可以参考我之前写的一篇关于 bfs 求二叉树宽度 的博客:二叉树专题–洛谷 P3884 [JLOI2009]二叉树问题

由于我们只关注层数的奇偶性,因此我们只需设置一个只有 0、1 两种取值的变量 dep,如果为 0 表示偶数层,为 1 表示奇数层,

当奇偶性改变的时候,对变量 dep 异或一个 1 即可。

时间复杂度:

O ( n ) O(n) O(n)

代码:

代码一:dfs(很短)

/*** 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:void dfs(tn* a, tn* b, int dep){if(!a) return ;if(dep) swap(a->val, b->val);dfs(a->le, b->ri, dep ^ 1), dfs(a->ri, b->le, dep ^ 1);}TreeNode* reverseOddLevels(TreeNode* root) {dfs(root->le, root->ri, 1);return root;}
};

代码二:bfs(较长)

/*** 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:tn* bfs(tn* u){qu<tn*> q; q.push(u), q.push(npt);vc<tn*> level;int dep = 0;while(!q.EP())      {auto tt = q.FT(); q.pop();if(!tt){if(level.EP()) break;if(dep){for(int i = 0, j = level.SZ() - 1; i < j; ++i, --j) swap(level[i]->val, level[j]->val);}dep ^= 1;q.push(npt);level.clear();continue;}level.pb(tt);if(tt->left) q.push(tt->le), q.push(tt->ri);}return u;}TreeNode* reverseOddLevels(TreeNode* root) {return bfs(root);}
};

宏定义代码:

typedef pair<int, int> pii;
typedef long long ll;
typedef double db;
#define x first
#define y second
#define tn TreeNode
#define npt nullptr
#define le left
#define ri right
#define qu queue
#define dq deque
#define vc vector
#define pq priority_queue
#define umap unordered_map
#define uset unordered_set
#define EP() empty()
#define SZ() size()
#define FT() front()
#define pb push_back
#define pf push_front
#define pp pop_back

http://chatgpt.dhexx.cn/article/vIo34w9w.shtml

相关文章

二叉树左右子树的翻转

翻转一个二叉树&#xff0c;直观上看&#xff0c;就是把二叉树的每一层左右顺序倒过来。比如问题中的例子&#xff0c;第三层1-3-6-9经过变换后变成了9-6-3-1&#xff0c;顺序反过来就对了。 再仔细观察一下&#xff0c;对于上面的例子&#xff0c;根节点&#xff08;root&…

算法-树-反转二叉树

问题 Write a function that takes in a Binary Tree and inverts it. In other words, the function should swap every left node in the tree for its corresponding (mirrored) right node. Each Binary Tree node has a value stored in a property called “value” and …

算法_二叉树_翻转二叉树

文章目录 翻转二叉树1.解法2.总结算法 翻转二叉树 leetcode链接 1.解法 解法思路&#xff1a; 想把二叉树翻转&#xff0c;其实仔细一看&#xff0c;就是把每个二叉树的节点的左右孩子翻转&#xff0c;这样总体效果就是把整个二叉树翻转了。 所以只需要通过一种遍历手段把…

Java 求解翻转二叉树

文章目录 一、题目二、题目分析三、递归法四、非递归法五、层序遍历六、总结一、题目 翻转一棵二叉树。 二、题目分析 题目要求翻转二叉树,其实只需要把每一个节点左右孩子交换(孩子下面的节点是一起交换的)即可 题目使用前序遍历和后序遍历都可,但是中序遍历不可以,因…

【LeetCode 6182 反转二叉树的奇数层】

题目描述 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &#xff0c;那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。反转后&#xff0c;返回树的根节点。 完美 二叉…

js 反转二叉树

什么是反转二叉树 二叉树的每个结点至多有两颗子树&#xff0c;不存在大于2个的节点&#xff0c;二叉树有左右之分&#xff0c;次序不能颠倒 初始数据 let list {id: "4",left: {id: "2",left: {id: "1",left: null,right: null,},right: {id: …

层序遍历,反转二叉树,对称二叉树

1.层序遍历 leetcode 一层层遍历二叉树 &#xff0c; 是广度优先搜索 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {queue< TreeNode* > que;vector < vector < int > > result;if ( root NULL ) return result…

力扣226:反转二叉树

翻转二叉树 题目思路①思路①代码思路②思路②代码总结 题目 给你一颗二叉树的根节点root&#xff0c;请你翻转该二叉树&#xff0c;并且返回其根节点。 思路① 如何判定二叉树是否翻转&#xff1f; 左右子树需要交换&#xff0c;左右子树内部的左右子节点也需要交换位置。…

翻转二叉树-python

leetCode第226题 翻转二叉树 链接&#xff1a;https://leetcode-cn.com/problems/invert-binary-tree 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,…

iOS实现反转二叉树(前序遍历二叉树)

题目: Input: Output: 首先分析下这个二叉树,从上往下看发现这个树是把树上的数据进行了交换,但是仔细一看发现最后一排的1-3反转过去后变成了3-1.所以得出结论,这道题是左右子树进行了交换,用函数递归就能很容易实现了. ## OC版本 声明节点属性&#xff1a; #import &…

二叉树翻转实例

1.问题描述 Invert a binary tree.For example: to Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off. 问题来源于Leetcode https://leetcode.com/problems/invert-binary-tree/ 2.问题…

LeetCode 2415. 反转二叉树的奇数层

2415. 反转二叉树的奇数层 【DFS】这个和对称二叉树一样&#xff0c;也是用一个双节点参数的函数来遍历这棵二叉树&#xff0c;在遍历的过程中交换左右两个节点的值即可。 class Solution {// 10:57 5 // dfsvoid dfs(TreeNode left, TreeNode right, int t) {if (left null)…

反转二叉树(二叉树的镜像)

输入一个二叉树&#xff0c;输出其镜像。 如下图&#xff0c;即交换所有节点的左右子树。 这里提供两种思路&#xff1a;使用递归和不使用递归。 使用的二叉树定义如下&#xff1a; public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeN…

二叉树反转java实现

项目github地址&#xff1a;bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star&#xff0c;留言&#xff0c;一起学习进步 反转二叉树是数据结构中一种经典的操作。如下图所以&#xff0c;反转二叉树就是交换所有节点的左右子树。 具体代码实现如下&#xf…

二叉树的翻转

目录 一、题目 二、解题思路 1、二叉树翻转 2、具体步骤&#xff08;迭代法&#xff09; 三、代码实现 一、题目 1、leetcode链接&#xff1a;力扣 2、题目内容&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&a…

一文详解反转二叉树

1 前言 LeetCode连接 根据二叉树的根节点root&#xff0c;反转这棵二叉树&#xff0c;并返回其根节点。 2 思路 总体思想是采用层序遍历《Java 一文详解二叉树的层序遍历》 【第一步】交换root的左右子节点 【第二步】交换节点7的左右子节点 【第三步】交换节点2的左右子节…

【算法笔记】反转二叉树

反转二叉树问题 翻转一棵二叉树。 示例&#xff1a; 输入&#xff1a; 输出&#xff1a; 问题分析 简单来说就是将每个节点的左右孩子互换&#xff0c;也就是遍历每一个节点然后交换它们的左右孩子&#xff0c;这里就可用到二叉树的各种遍历方法&#xff0c;只是将保存节…

【二叉树】三种方式解决翻转二叉树问题

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 思路&#xff1a; 可能大家开始看都觉得很懵&#xff0c;但是我们要抓住这道题的本题。所谓的翻转二叉树还不如就叫交换二叉树左右子节点&#xff0c;说到这里是不是就很清晰了…

【数据结构】翻转二叉树的三种方式

一、分析 理解递归思想的条件下很容易想到解题思路&#xff0c;当然可能有人会有疑问&#xff0c;那什么情况下知道使用递归呢&#xff0c;有个最简单的办法如果算法里需要重复循环用同一个思路执行得到结果&#xff0c;那么必然可以使用递归。进行翻转本质上可以拆分为两步递…

以太网常用接口

1.PHY层的主要作用就是将MAC层数据&#xff08;MII接口数据&#xff09;通过串并转换器&#xff0c;重新排序&#xff0c;并根据响应的调制方式&#xff0c;将信号重新编码&#xff0c;再通过MDI接口&#xff08;介质相关接口&#xff09;将数据通过对应线路传送出去。具体过程…