力扣226:反转二叉树

article/2025/9/4 22:28:52

翻转二叉树

  • 题目
  • 思路①
  • 思路①代码
  • 思路②
  • 思路②代码
  • 总结


题目

给你一颗二叉树的根节点root,请你翻转该二叉树,并且返回其根节点。
在这里插入图片描述


思路①

如何判定二叉树是否翻转?

  • 左右子树需要交换,左右子树内部的左右子节点也需要交换位置
  • 根节点root表示:
    首先交换左右子树,递归压栈压到底部,然后开始交换,位于底部的、左右子树都是null的子树,首先被翻转。随着递归向上返回,子树都被一个个翻转,整颗二叉树也随即翻转到位。

思路①代码

const invertTree = (root) => {if (root == null) { // 遍历到null节点时,不用翻转,直接返回它本身return root;}invertTree(root.left);invertTree(root.right);const temp = root.left;root.left = root.right;root.right = temp;return root;
};

思路②

  • 首先考虑先交换左右子树,内部子树还没有翻转——这部分交给递归处理。
  • 其次在交换这一步的操作,放在递归之前
  • 题目的要求是在递归压栈之前完成。

思路②代码

const invertTree = (root) => {if (root == null) { // 遍历到null节点时,不用翻转,直接返回它本身return root;}const temp = root.left;root.left = root.right;root.right = temp;// 内部的翻转交给递归去做invertTree(root.left);invertTree(root.right);return root;
};

总结

两种分别是前序遍历和后序遍历,并且基于DFS深度优先遍历,如下实例所示:

  • 整数排列:给定数字N,给出按照字典序的排列。

代码,C++实现:

//排列数字,给定整数N,按照字典序排列
#include <iostream>
using namespace std;const int N = 10;int n;
int path[N];  //用一个全局数组实现存储方法状态
bool st[N];   //判定一个数是否用过?void dfs(int u) {if (u == n) {//说明一个排列已经把所有位置排满了,当前位置输出就行for (int i = 0; i < n; i++) {printf("%d ", path[i]);}puts("");return;}/*u < n,说明还没有填完,也就是还没有得到一种方案数枚举一下当前这个位置可以填哪些数 */for (int i = 1; i <= n; i++) {if (!st[i]) {//找到了一个没有被用过的数path[u] = i;//记录该数已经被使用过st[i] = true;//状态处理好之后递归到下一层dfs(u + 1);//恢复现场,path[u] = 0没有必要,因为会被不断的覆盖st[i] = false;}}
}int main() {cin >> n;dfs(0);return 0;
}

实例2,八皇后问题,给出代码如下:

  • 时间复杂度,O(n*n!),较优解法,实例为4 × 4棋盘,4个皇后。
//八皇后问题
#include <bits/stdc++.h>
using namespace std;
const int N = 20;int n;
char g[N][N]; 				//表示方案数
bool col[N], dg[N], udg[N]; //分别检验同一列、正反对角线是否只有一个皇后void dfs(int u) {if (u == n) {//当找到一组方案的时候,输出for (int i = 0; i < n; i++) {puts(g[i]);}puts("");return ;}//从前往后枚举u行,看皇后应该在哪一列for (int i = 0; i < n; i++) {if (!col[i] && !dg[u + i] && !udg[n - u + i]) {//某一列,某条对角线都没有元素放入过g[u][i] = 'Q';//已经有皇后元素col[i] = dg[u + i] = udg[n - u + i] = true;dfs(u + 1);//恢复现场col[i] = dg[u + i] = udg[n - u + i] = false;g[u][i] = '*';//到这可以发现if语句完全对称}}
}int main() {cout << "请输入整数:" << endl;cin >> n;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {g[i][j] = '*';}}dfs(0);return 0;
}

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

相关文章

翻转二叉树-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;将数据通过对应线路传送出去。具体过程…

用计算机输入输出,计算机输入/输出接口的作用是什么

计算机输入/输出接口的作用是什么以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 计算机输入/输出接口的作用是什么 计算机输入输出接口是CPU与外部设备之间交换信息的连接电路,它们通过总线与CPU相连,简称I/O…

IO接口概念

本部分是作者在复习计算机组成原理时候参考王道视频做的笔记。 I/O接口&#xff1a;又称I/O控制器(I/O Controller)、设备控制器&#xff0c;负责协调主机与外部设备之间的数据传输。 IO接口的作用 数据缓冲:通过数据缓冲寄存器&#xff08;DBR&#xff09;达到主机和外设工…

EnvironmentAware接口的作用

在SpringBoot中的应用 凡注册到Spring容器内的bean&#xff0c;实现了EnvironmentAware接口重写setEnvironment方法后&#xff0c;在工程启动时可以获得application.properties的配置文件配置的属性值。 demo演示 直接上代码&#xff0c;比如我的application.properties文件有…

接口文档在项目中的作用

前后端合作开发的时候经常需要用到接口文档&#xff0c;那么接口文档在产品中究竟有什么作用&#xff1f;该如何去规范呢&#xff1f; 约束 假如你的项目中有若干前端和若干后端。你现在需要开发一个登陆接口&#xff0c;通常情况下这个功能一个前端和一个后端开发就足够了。…

接口的组成和作用

脑图&#xff1a; 什么是接口&#xff1f; 接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点&#xff0c;定义特定的交互点&#xff0c;然后通过这些交互点来&#xff0c;通过一些特殊的规则也就是协议&#xff0c;来进行数据之间的交互。 接口都有哪些类型…

Java序列化接口Serializable接口的作用总结

一.Java序列化接口Serializable的作用&#xff1a; 一个对象有对应的一些属性,把这个对象保存在硬盘上的过程叫做”持久化”. 对象的默认序列化机制写入的内容是&#xff1a;对象的类&#xff0c;类签名&#xff0c;以及非瞬态和非静态字段的值。(因为静态static的东西在方…

serializable接口的作用是什么?

serializable接口的作用&#xff1a; 1、存储对象在存储介质中&#xff0c;以便在下次使用的时候&#xff0c;可以很快捷的重建一个副本&#xff1b; 2、便于数据传输&#xff0c;尤其是在远程调用的时候。 Serializable接口是启用其序列化功能的接口。实现java.io.Serializ…

Mapper 接口的如何起作用

在 MyBatis 的初始化过程中&#xff0c;每个一个 XML 映射文件中的<select />、<insert />、<update />、<delete />标签&#xff0c;会被解析成一个 MappedStatement 对像&#xff0c;对应的 id 就是 XML 映射文件配置的 namespace’.’statementId&a…