【数据结构】翻转二叉树的三种方式
一、分析![](/assets/blank.gif)
理解递归思想的条件下很容易想到解题思路,当然可能有人会有疑问,那什么情况下知道使用递归呢,有个最简单的办法如果算法里需要重复循环用同一个思路执行得到结果,那么必然可以使用递归。进行翻转本质上可以拆分为两步递归,递归翻转左子树和递归翻转右子树分。无论是否使用递归本质思想是一致的,使用非递归的方式则需要借助使用栈或者队列的结构进行存储未交换的子节点。
二、反转二叉树的实现方式
方式一:使用栈实现
本质思想是,左右节点进行交换,循环翻转每个节点的左右子节点,将未翻转的子节点存入栈中,循环直到栈里所有节点都循环交换完为止。
public TreeNode invertTree(TreeNode root) { if (root == null) {return null;}Stack<TreeNode> stack = new Stack<>();stack.push(root); while(!stack.isEmpty()) {final TreeNode node = stack.pop();final TreeNode left = node.left;node.left = node.right;node.right = left; if(node.left != null) {stack.push(node.left);}if(node.right != null) {stack.push(node.right);}}return root;}
方式二:使用队列实现
本质思想是,左右节点进行交换,循环翻转每个节点的左右子节点,将未翻转的子节点存入队列中,循环直到栈里所有节点都循环交换完为止。
public TreeNode invertTree(TreeNode root) {if (root == null) {return null;}Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();TreeNode left = node.left;node.left = node.right;node.right = left;if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}return root;}
方式三:使用递归来实现
本质思想,是左右节点进行交换,交换前递归调用对根结点的左右节点分别进行处理,保证交换前左右节点已经翻转。
public TreeNode invertTree(TreeNode node) {if (node == null) {return null;}TreeNode temp = node.left;node.left = node.right;node.right = temp;invertTree(node.left);invertTree(node.right);return node;}
【数据结构】翻转二叉树的三种方式相关推荐
- 【二叉树】三种方式解决翻转二叉树问题
题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点. 思路: 可能大家开始看都觉得很懵,但是我们要抓住这道题的本题.所谓的翻转二叉树还不如就叫交换二叉树左右子节点,说到这里是 ...
- 数据结构:关于重建二叉树的三种思路
前言: 前几天在温习<编程之美>这本书的时候,看到了二叉树的重建.正好,也想复习一下数据结构的知识,就来写了一个小Demo.居然有新发现(本文中的第三种方式). 我们在学习数据结构的时候, ...
- 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历
二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...
- C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)
关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...
- c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...
- 二叉树----数据结构:二叉树的三种遍历及习题
二叉树----数据结构:二叉树的三种遍历,利用递归算法. 关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值.删除.查找.求二叉树的深度等等. 有递归和非递归两种算法 ...
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...
- 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...
- c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理
C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...
最新文章
- 自定义notebook扩展插件_Jupyter notebook安装扩展插件
- android连接不上socket,关于socket通信的android与pc端连接,为什么我定义的socket是为空的,连接不上pc端...
- 未来,中国空间站将成为怎样的“太空科研站”?
- mysql和hbase优缺点_hbase优缺点
- window.open 实现session隔离_InnoDB存储引擎MVCC实现原理
- (计算机组成原理)第二章数据的表示和运算-第二节5:定点数乘法运算(原码/补码一位乘法)
- HDU1052 田忌赛马 贪心
- 企业数字化转型必备利器之微服务扩展
- PhotoShop插件的开发
- 联想 R9000 系列以及Realtek Semiconductor Co., Ltd. Device 88xx系列 Ubuntu WIFI 不能使用
- SQL Server数据库优化的几种方法.
- 【电路基础】第1章-电路的基本规律(1)
- WordPress 跨站请求伪造漏洞
- CSS设置字体为微软雅黑 且 解决用户设备上没有该字体的问题
- STM32深入实践教程目录
- 云服务器怎么采购便宜?云服务器优惠 3 大准则
- 单页面cnd 引入 vant+vue+h5 应用vant
- 迭代 装饰器 闭包
- SQL基础系列(四)——多表查询
- 云栖大会——阿里聚安全亮出创新技术 颠覆APP传统安全加固