题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

思路:

可能大家开始看都觉得很懵,但是我们要抓住这道题的本题。所谓的翻转二叉树还不如就叫交换二叉树左右子节点,说到这里是不是就很清晰了。

对于交换二叉树左右子节点来说我们可以采取很多方式,换句话说,如何遍历不重要,只要在遍历过程中,交换遍历到的每个节点的左右子节点就可以了。

方法一: 递归先序遍历(后序遍历也可以)

递归函数的退出条件为当前遍历到的节点为空,每次遍历到一个节点,执行的操作为交换其左右子节点,然后再递归的遍历其左右子树。

    // 翻转二叉树 _ 递归法public TreeNode invertTree(TreeNode root) {if(root == null){return null;}swap(root);invertTree(root.left);invertTree(root.right);return root;}public void swap(TreeNode root){TreeNode temp = root.left;root.left = root.right;root.right = temp;}

方法二:迭代先序遍历

二叉树的递归遍历法可以用迭代的方式写出,因此稍作修改就能得到如下代码。在迭代遍历的过程中交换左右节点即可。

    // 翻转二叉树 _ 迭代法public TreeNode invertTree2(TreeNode root){if(root == null){return root;}Stack<TreeNode> stack = new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode node = stack.pop();if(node.left != null) stack.push(node.left);if(node.right != null) stack.push(node.right);swap(node);}return root;}

方法三:层序遍历

因为本题只需要交换每个节点的左右节点,因此与层序遍历也是可以解决的,同样是采用在遍历的过程中,交换每个遍历到的节点的左右节点即可。

    // 翻转二叉树 _ 层序遍历public TreeNode invertTree3(TreeNode root){if(root == null){return root;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size = queue.size();for(int i=0; i<size; i++){TreeNode node = queue.poll();swap(node);if(node.left != null) queue.offer(node.left);if(node.right != null) queue.offer(node.right);}}return root;}

总结:通过这道题的解决,我体会到了二叉树问题的解决离不开二叉树的基础遍历方法,因此,一定要学好并理解基础遍历方法。

【二叉树】三种方式解决翻转二叉树问题相关推荐

  1. Qt工作笔记-三种方式解决Qt5中文编码问题

    目录 前言 方式一 方式二 方式三 三种方式解决Qt5中文编码问题 前言 这里不谈原理,只说如何去做! 这里本人自己总结下,今天遇到了新的编码问题,在此记录下,方面以后快速调用. 把这三种方法顺序试下 ...

  2. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

    文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...

  3. v html如何添加样式,详解三种方式解决vue中v-html元素中标签样式

    Vue为v-html中标签添加CSS样式 {{news.title}} {{news.datetime}} 返回列表 当我们使用v-html渲染页面,使用下面这种方式去修改样式并没有效果, .con{ ...

  4. vue v-html字体大小修改,详解三种方式解决vue中v-html元素中标签样式

    Vue为v-html中标签添加CSS样式 {{news.title}} {{news.datetime}} 返回列表 当我们使用v-html渲染页面,使用下面这种方式去修改样式并没有效果, .con{ ...

  5. 【 Perl 】三种方式解决” Wide character in print “

    1.binmode STDOUT, ":utf8"; 因为程序本身是用utf8编码的(可以用use utf;明示给Perl).这句话就是告诉Perl输出是utf8编码的. 2.us ...

  6. JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)

    package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...

  7. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  8. $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式

    这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题.大家可以收藏起来,以备用时之需! 1.同源策略 1.1 含义 ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略&q ...

  9. AJAX异步请求解决跨域问题的三种方式

    一 什么是跨域 出于浏览器的同源策略限制.同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说We ...

最新文章

  1. SEO之网站页面优化策略
  2. spring aop实现过程之三Spring AOP中Aspect编织的实现
  3. 神经网络,流形和拓扑Neural Networks, Manifolds, and Topology
  4. matlab白噪音wav,通过matlab产生wav的白噪声.pdf
  5. 征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算
  6. 计算机 游戏 排名2015年,2015十大高性能游戏笔记本电脑排行 最强游戏本推荐
  7. Python---编程检查并判断密码字符串的安全强度
  8. jQuery.Form.js 异步提交表单使用总结
  9. perl语言之列表与数组
  10. 生物信息学概论_大学专业详解系列83——生物信息学(理学学士)
  11. Word2Vec学习笔记(二)
  12. 15个带示例的jQuery滚动条插件
  13. 【maven】maven dependencyManagement 锁定Jar包版本
  14. DataTable类(MSDN)
  15. C#中IListT与ListT的区别感想
  16. 【Python学习】sklearn层次聚类
  17. 利用Java反射机制调用含数组参数的方法
  18. 基于JAVA电商购物商城系统设计与实现 开题报告
  19. HTTPS 证书手机浏览有风险怎么办
  20. jquery 堆栈溢出_带有jQuery和CSS3的漂亮照片堆栈库

热门文章

  1. LeetCode 453. 最小移动次数使数组元素相等
  2. 推荐一下:BIOS之家
  3. 福禄克DSX-5000 官方授权代理
  4. vs打开sln是空白_周末惊喜版块 | 新文速递 强推全息网游无限流鬼怪文/软妹身大佬心锦鲤女主VS阴郁暴躁倒霉蛋男主【言情】01.20...
  5. WordPress自适应主题Puock v2.4/白天暗夜高颜值无刷新加载首页支持三种布局
  6. Springboot 集成kafka
  7. 柔情在暗夜思绪里泛滥(转)
  8. 数仓建设几个关键问题
  9. C盘temp目录cab_xxxx_x文件
  10. 2016-2020历年旗舰新机