算法-树-反转二叉树
问题
Write a function that takes in a Binary Tree and inverts it. In other words, the function should swap every left node in the tree for its corresponding (mirrored) right node. Each Binary Tree node has a value stored in a property called “value” and two children nodes stored in properties called “left” and “right,” respectively. Children nodes can either be Binary Tree nodes themselves or the None (null) value.
编写一个接受二叉树并将其反转的函数。换句话说**,该函数应该将树中的每个左节点交换为相应的(镜像的)右节点**。每个二叉树节点都有一个值存储在名为“value”的属性中,两个子节点分别存储在名为“left”和“right”的属性中。子节点可以是二叉树节点本身,也可以是None(null)值。
左边是原始的二叉树,右边是反转后的二叉树,可以看到左右节点进行了交换。
思路
循环处理
用一个队列中放进去,然后pop出头部的节点,再将该节点的两个子节点进行交换,再将两个子节点放入队列中去,循环处理
- 处理根节点
1
- 然后将节点
1
向左移出来,再交换1
节点的两个子节点2
,3
,然后再将两个子节点3
,2
放入到队列中
- 处理
3
节点
1
节点处理完毕,处理3
节点, 对3
节点的两个子节点6
,7
进行交换,再将7
,6
放入到队列中
- 处理
2
节点
3
节点处理完毕,处理2
节点, 对2
节点的两个子节点4
,5
进行交换,再将5
,4
放入到队列中
- 处理
7
节点
2
节点处理完毕,处理7
节点, 对7
节点的两个子节点None
,None
进行交换,再将None
,None
放入到队列中
- 处理
6
节点
7
节点处理完毕,处理6
节点, 对6
节点的两个子节点None
,None
进行交换,再将None
,None
放入到队列中
- 处理
4
节点
处理完
6
节点后,处理4
节点, 对4
节点的两个子节点8
,9
进行交换,再将9
,8
放入到队列中
以此类推…
实现
class BinaryTree:def __init__(self, value):self.value = valueself.left = Noneself.right = None# O(n) time | O(n) space
def invertBinaryTree(tree):queue = [tree]while len(queue):current = queue.pop(0)if current is None:continueswapLeftAndRight(current)queue.append(current.left)queue.append(current.right)def swapLeftAndRight(tree):tree.left, tree.right = tree.right, tree.left
- 时间复杂度:O(N)O(N)O(N)
- 空间复杂度:O(N)O(N)O(N)
递归处理
采用递归的思想,每个节点只考虑它自己,然后交换它的子节点。之后递归它的两个子节点即可。
class BinaryTree:def __init__(self, value):self.value = valueself.left = Noneself.right = None# O(n) time | O(d) space
def invertBinaryTree(tree):if tree is None:returnswapLeftAndRight(tree)invertBinaryTree(tree.left)invertBinaryTree(tree.right)def swapLeftAndRight(tree):tree.left, tree.right = tree.right, tree.left
- 时间复杂度:O(N)O(N)O(N)
- 空间复杂度:O(D)O(D)O(D) 树的深度
算法-树-反转二叉树相关推荐
- 让HomeBrew作者面试谷歌翻车的经典算法题 反转二叉树 Node.js 版
var invertTree = function(root) {if(root === null){return root}let tmpLeft = root.left;root.left = r ...
- 数据结构与算法——树和二叉树***
第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...
- 数据结构与算法——树与二叉树详细分享
一.树 1.定义:由n个有限节点组成一个具有层次关系的集合,看起来像一颗倒挂的树,特点: 2.特点: a.每个节点有0个或多个子节点 b.没有父节点的节点称为根节点(A) c.每一个非根节点有且只有一 ...
- Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)
目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...
- 数据结构与算法 | 树与二叉树
树的概念 二叉树的概念 树的概念和结构 树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,如图所示 有一个特殊的结点,称为根节点,根节点没 ...
- 【LeetCode-面试算法经典-Java实现】【226-Invert Binary Tree(反转二叉树)】
[226-Invert Binary Tree(反转二叉树)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun- ...
- 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)
这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树 和 各种基本算法实现小结( ...
- 我的软考之路(四)——数据结构与算法(2)之树与二叉树
上篇博文主要介绍的是数据结构的线性结构,我们这篇博文介绍非线性结构-树与二叉树,我先介绍树的一些基本概念,树的遍历,再介绍二叉树相关概念和特性,以及二叉树的遍历,最后再树与二叉树的对比,总结. 树为了 ...
最新文章
- 分支1-CentOS6.5下 正/反向域名解析之yum安装/编译安装 的教程
- 真「祖传代码」!你的GitHub代码已打包运往北极,传给1000年后人类
- Mysql 导入导出csv 中文乱码问题的解决方法
- DELL 通过iDrac安装ESXI
- 仿LordPE获取PE结构
- PPT | 云客堂——云服务助力Java 应用程序开发及部署
- 给窗口添加背景图的案例
- request 和require区别_JAVA WEB开发中涉及到的get和post请求,他们的区别
- a1277以太网适配器驱动_福禄克DSX系列工业以太网连接器集锦
- 伟创ac80b变频器故障代码_安川变频器故障代码和安川变频器报警详解
- 计算机无法读取tf卡,为什么电脑不识别TF卡?
- c++ 的interface
- 蛋壳梦破:CEO被限制消费,资金链碎了一地
- 下一轮WiFi革命来临:详解高通MU-MIMO技术(Multi-User Multiple-Input Multiple-Output多用户多入多出技术)
- 悟透JavaScript-对象素描
- docker: 打包h5项目的镜像
- 什么是客户端容器化?
- echarts图表显示相关
- creator 挖洞 转发
- Dreamweaver8加载站点缓存时卡死,解决办法: