二叉树(四)、反转二叉树
一、二叉树翻转理论
想要翻转二叉树,要进行以下两个步骤:
- 遍历二叉树每一个节点
- 翻转每一个节点的左右孩子节点,没有左右孩子节点的可以视作其左右孩子节点为nullptr
二、二叉树翻转代码
- 翻转二叉树
1、前序遍历翻转二叉树
class Solution {public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;swap(root->left, root->right); // 中invertTree(root->left); // 左invertTree(root->right); // 右return root;}
};
2、后序遍历翻转二叉树
class Solution {public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;invertTree(root->left); // 左invertTree(root->right); // 右swap(root->left, root->right); // 中return root;}
};
3、中序遍历翻转二叉树
注意,先翻转了left,然后翻转了root,此时没有翻转的right变成了left,因此中序遍历需要特别注意在交换了root后,right是原来的left,left是原来的right。
class Solution {public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;invertTree(root->left); // 左swap(root->left, root->right); // 中invertTree(root->left); // 右 注意这里的left是原来的右return root;}
};
class Solution {public:TreeNode* invertTree(TreeNode* root) {if (root == NULL) return root;invertTree(root->right); // 左swap(root->left, root->right); // 中invertTree(root->right); // 右 注意这里的是right是原来的左return root;}
};
4、层次遍历翻转二叉树
将层次遍历时将二叉树节点值存入结果的操作
变成翻转左右孩子节点的操作
即可。
class Solution {public:TreeNode* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root != nullptr){st.push(root);while(!st.empty()){TreeNode* node = st.top();if(node != nullptr){st.pop();if(node->right) st.push(node->right);if(node->left) st.push(node->left);st.push(node);st.push(nullptr);} else {st.pop();node = st.top();st.pop();//和层次翻转二叉树相比,只是改变了对排好的节点的处理办法swap(node->left, node->right);}}}return root;}
};
二叉树(四)、反转二叉树相关推荐
- 算法-二叉树:反转二叉树
算法-二叉树:反转二叉树 思路解析:只要把每个节点的左右孩子反转一下就可以了,注意不要采用中序遍历,因为可能会把某些节点的左右孩子反转两次.以下方法采用前序遍历,方法一采用递归,方法二采用迭代. // ...
- 反转二叉树 java_反转二叉树【Java】
packagecom.example.demo.tree;importcom.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;importor ...
- 让HomeBrew作者面试谷歌翻车的经典算法题 反转二叉树 Node.js 版
var invertTree = function(root) {if(root === null){return root}let tmpLeft = root.left;root.left = r ...
- 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)
这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...
- leetCode题解之反转二叉树
1.题目描述 经典的反转二叉树,就是将二叉树中每个节点的左.右儿子交换. 2.题目分析 3.代码 1 TreeNode* invertTree(TreeNode* root) { 2 3 if(roo ...
- PAT甲级1102 Invert a Binary Tree:[C++题解]反转二叉树、递归
文章目录 题目分析 题目链接 题目分析 反转二叉树这道题目特别出名!!!,是因为Homebrew这款Mac上大火的软件的作者到google面试,就考了这道题.面试官说了下面这段话:你竟然连在白板上翻转 ...
- 数据结构与算法笔记(十四)—— 二叉树
一.二叉树的基本概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree) 和"右子树"(right subtree). ...
- [LeetCode][JavaScript]Invert Binary Tree 反转二叉树
反转二叉树 其实我从没有想到前端面试会问到这个问题,题目来源于google的面试 Google: 90% of our engineers use the software you wrote (Ho ...
- C语言反转二叉树的递归和迭代解决方案(附完整源码)
C语言反转二叉树的递归和迭代解决方案 C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) C语言反转二叉树的递归和迭代解决方案完整源码(定义,实现,main函数测试) #in ...
最新文章
- .data和.text段合并
- CVPR2021:推广到开放世界的在线自适应深度视觉里程计
- java集合框架史上最详解(list set 以及map)
- android筛选cookie,服务器无法从Android手机识别Cookie
- JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用
- 2020 我的C++学习之路 C++PrimerPlus第四章课后习题
- Oracle GoldenGate 详解
- 【TensorFlow】TensorFlow函数精讲之value()
- 设计模式全解析 23种
- 160508Junit使用
- 二进制,八进制,十六进制,十进制之间的换算
- python给一个不多于5位的正整数 要求_python作业题2 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。...
- 【Golang】家庭收支记账软件
- 蓄电池浮充电和均充电
- cuBLAS使用(4)
- JavaScript replace之字符串的方法与indexOf的用法 详解
- Linux exec函数的使用
- 网络检测--命令检测网络
- vue项目 使用svg渲染地图 并添加点击事件,动态改变背景颜色
- Android 12.0关机界面全屏显示(UI全屏显示)
热门文章
- 脱离spring cloud使用feign
- 量化投资-基本面组合-10大基本面策略的简单组合
- 上网必备!这些网站绝对是互联网宝藏!带你进入全新的在线世界
- 运营的笔试中相关基础知识概念
- java switch table_关于java:JVM的LookupSwitch和TableSwitch之间的区别?
- 使用govendor管理Golang项目依赖
- 怀旧软件_50多个最佳复古怀旧Photoshop教程
- std::string::npos 常量解析
- 【k8s】修改docker的docker.service并重启docker服务
- 红帽系统RHEL7 安装cuda10.2及对应的cudnn7.6.5