翻转二叉树

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

题目

给你一颗二叉树的根节点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;
}

力扣226:反转二叉树相关推荐

  1. 力扣226. 翻转二叉树(JavaScript)

    方法一:递归 var invertTree = function(root) {let swap=function(left,right){let temp=leftleft=rightright=t ...

  2. 力扣题目——103. 二叉树的锯齿形层序遍历

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值的锯齿形层序遍历.(即先从左往右,再从右往左进行 ...

  3. 力扣题目——107. 二叉树的层序遍历 II

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根 ...

  4. 双指针算法 | 力扣344. 反转字符串

    本文讲解力扣344. 反转字符串问题 也就是使用双指针的思想 很简单的一道题 1 题目 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组 ...

  5. 力扣题目——637. 二叉树的层平均值

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 示例: 输入: ...

  6. 力扣 (LeetCode)-对称二叉树,树|刷题打卡

    Github来源:力扣 (LeetCode)|刷题打卡 | 求星星 ✨ | 给个❤️关注,❤️点赞,❤️鼓励一下作者 [已开启]任务一:刷题打卡 * 10 篇 哪吒人生信条:如果你所学的东西 处于喜欢 ...

  7. 力扣 345. 反转字符串中的元音字母

    题目 给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串. 元音字母包括 'a'.'e'.'i'.'o'.'u',且可能以大小写两种形式出现. 示例 输入:s = "hel ...

  8. 【Java语言】力扣系列----111. 二叉树的最小深度

    给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7],3 ...

  9. 力扣206 - 反转链表【校招面试高频考题】

    乾坤大挪移~ 一.题目描述 二.思路分析 1.头插 2.三指针迭代 三.整体代码展示[需要自取] 1.头插 2.三指针迭代 四.总结与提炼 一.题目描述 原题传送门 给你单链表的头节点 head ,请 ...

最新文章

  1. (二)spring cloud微服务分布式云架构 - 整合企业架构的技术点
  2. oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen
  3. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
  4. 键盘各键对应的ASCII码值
  5. 【《Objective-C基础教程 》笔记】(八)OC的基本事实和OC杂七杂八的疑问
  6. Oracle 10.2.0.4 高负载 触发 ORA-00494 错误
  7. 如何高效的Code Review
  8. 如何将yolo的标注(annotations).txt 坐标转换成tensorflow-yolov3(YunYang1994)的.txt 标注坐标?
  9. android设置系统横屏方案
  10. 记一次偶遇Adminer
  11. ubunttu: 使用DiskGenius克隆系统和分区
  12. 2013年网络安全事件盘点
  13. (转)淘淘商城系列——SSM框架整合之Dao层整合
  14. operator() error
  15. xlrd读取所有sheet名_如何在Python对Excel进行读取
  16. Centos 查看CPU个数、核心数等信息
  17. 基于C++的顺序表的实现
  18. android 获取签名的md5值,获取Android MD5签名
  19. 固态硬盘量产工具_固态硬盘测速工具CDM更新8.0版,但我们不推荐你使用
  20. matlab红点沿着正弦曲线运动,如何使用css3让一个元素做正弦曲线运动?

热门文章

  1. css块元素与行内元素特点,行内元素和块元素以及行内块元素的特点
  2. PS切片时,如何选择图片保存格式
  3. RedisInsight:Redis监控工具部署(linux)
  4. c语言输出7 和7 的倍数
  5. 从书本《皮囊》摘录的几个句子
  6. 你看到的漫画,可能不是人画出来的
  7. e-cology在广告行销—泛微协同广告行业解决方案
  8. Chrome Adobe Flash Player 因过期而 阻止
  9. 第八天 集合和字符串
  10. DSP UART配置和使用