java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法
题目描述
操作给定的二叉树,将其变翻转为源二叉树的镜像。
输入描述:
1 1
/ \ / \
2 3 ——————> 3 2
/ \ / \ / \ / \
4 5 6 7 7 6 5 4
解题思路
递归版本
首先,对数据结构比较了解的话会想到用递归来解决。
所谓递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法(来自维基百科)。这个解释还是比较教条的,对于工程师来说,首先要思考:
分解问题后的子问题是什么,也就是重复的那一部分是什么?
什么时候结束重复?即终止条件是什么
回到翻转二叉树的问题,我们梳理一遍整个翻转过程:
root开始,交换root的left元素和root.right元素
root.left开始,交换root.left.left元素和root.left.right元素
root.right开始,交换root.right.left元素和root.right.right元素
...
...
可以看出来重复的部分是:交换X元素的left和right元素,用伪代码表示为:
temp = X.left;
X.left = X.right;
X.right = temp;
那么终止条件是什么呢?很显然是当元素为null时,它就谈不上去交换左右子元素了,所以X=null时终止递归。
此时代码就很好写了:
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function Mirror(root){
// 终止条件
if(root === null)
return;
// 重复操作的部分
var temp = root.left;
root.left = root.right;
root.right = temp;
//分别再对左右子节点进行同样的操作
Mirror(root.left);
Mirror(root.right);
}
非递归版本
非递归版本可以从树的层次遍历上找到灵感,无非就是按照层来遍历树的节点,且一边遍历一边交换当前节点的左右子节点,直到遍历完毕就OK
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function Mirror(root){
if(root === null)
return;
var queue = [];// 队列来辅助遍历树
queue.push(root);
while(queue.length !== 0) {
var cur = queue.shift();// 弹出队列头的元素,交换它的左右子节点
if(cur !== null) {
var temp = cur.left;
cur.left = cur.right;
cur.right = temp;
queue.push(cur.left)// 左子节点入队
queue.push(cur.right);// 右子节点入队
}
}
}
java 反转二叉树 非递归_【刷算法】翻转二叉树的递归和非递归解法相关推荐
- c++编写算法判断二叉树是否为完全二叉树_[校招-算法题] 二叉树基础算法1
二叉树是面试中常考的数据结构,因为涉及大量指针操作,因此可以考察思维的严谨性和灵活性.但是校招中的二叉树题规律性很强,因此需要总结一下. 各种常见的二叉树概念 二叉树:每个结点最多有两个子树(左子树和 ...
- Java算法——翻转二叉树(LeetCode第226题)
问题描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点. 示例 分析 自顶向下递归交换每个结点的左右子树,便可将整棵树翻转. 代码实现 class Solution {publi ...
- 二叉树后序遍历_LeetCode算法145. 二叉树的后序遍历
leetcode LeetCode算法-145. 二叉树的后序遍历 145. 二叉树的后序遍历 题目 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / ...
- 代码随想录算法训练营第15天,102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树
102.二叉树的层序遍历.226.反转二叉树.101.对称二叉树 102.二叉树的层序遍历 二叉树的层次遍历,我们可以定义一个队列, 当访问到某一个节点时,我们将它存在的左右节点放入队列中,便可达到按 ...
- 代码随想录算法训练营Day15|Leetcode102二叉树的层序遍历、Leetcode226翻转二叉树、Leetcode101对称二叉树
Day15打卡! 时长:2h 今日感想:今天主要学习了二叉树层次遍历的思路方法和应用.题目看似简单,实则有很多细节,有时间可以做做其他相似的推荐题目~ Leetcode102 二叉树的层序遍历 题目链 ...
- 代码随想录算法训练营第十三天|102.二叉树的层序遍历、226.翻转二叉树、101.对称二叉树
链接:代码随想录 文章目录 102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树 解题方法 题目思路 示例代码 总结 解题思路 1.102.二叉树的层次遍历 解题思路 递归法,创立二维数组 ...
- 代码随想录算法训练营day15 | 102. 二叉树的层序遍历、226. 翻转二叉树、101. 对称二叉树
102. 二叉树的层序遍历 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {de ...
- 【二叉树】三种方式解决翻转二叉树问题
题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点. 思路: 可能大家开始看都觉得很懵,但是我们要抓住这道题的本题.所谓的翻转二叉树还不如就叫交换二叉树左右子节点,说到这里是 ...
- LeetCode 366. 寻找二叉树的叶子节点(上下翻转二叉树+BFS)
文章目录 1. 题目 2. 解题 1. 题目 给你一棵二叉树,请按以下要求的顺序收集它的全部节点: 依次从左到右,每次收集并删除所有的叶子节点 重复如上过程直到整棵树为空 示例: 输入: [1,2,3 ...
- 二叉树层序遍历递归与非递归_总结归纳:二叉树遍历【递归 amp;amp; 非递归】...
今天为大家总结了二叉树前中后序遍历的递归与迭代解法: 1. 前序遍历 递归 List list=new ArrayList<>();public ListpreOrder(TreeNode ...
最新文章
- Python requests 多线程抓取 出现HTTPConnectionPool Max retires exceeded异常
- 与动态执行的C# 代码进行通讯
- java note项目_note(java)
- PL/SQL developer执行的sql文件编码
- 使用Asible连接被控端SHH拒绝解决办法
- Spring 4 + Reactor Integration Example--转
- RPM 包相关命令详解
- NoSQL系列:选择合适的数据库
- .NET做人脸识别并分类
- 呼吁开放外网_服装数据集:呼吁采取行动
- 数字三角形(洛谷-P1118)
- struts2 ajax上传文件 file空_WordPress插件漏洞分析:WPDiscuz任意文件上传漏洞
- PyTorch 学习笔记(七):PyTorch的十个优化器
- 可调稳压电源lm317实验报告_LM317可调直流稳压电源DIY,非常实用!
- vue 登陆成功后携带不了后台传来的 set-cookie 并携带请求错误处理
- android双系统切换软件,可一键切换安卓/Win!双系统设备涌现CES
- opencv毛孔识别(python实现)
- 南大软院大神养成计划--HTML和CSS基础课程(二)
- 深度学习图像标签标注软件labelme超详细教程
- Oracle 19c VLDB and Partitioning Guide 第2章:Partitioning Concepts 读书笔记
热门文章
- matlab简单分析矩阵乘法——一阶行向量乘一阶列向量
- SRAM6264(8K*8)
- python快速入门及进阶
- ScheduledThreadPoolExecutor Usage
- 唱吧DevOps的落地,微服务CI/CD的范本技术解读
- POJ3461 【KMP(粗糙模板)】
- Kettle行列转换
- 在WPF中自定义你的绘制(二)
- POJ 1325 Machine Schedule(zoj 1364) 最小覆盖数
- [转载] python 超高精度除法_Python十进制-除法,舍入,精度