问题

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) 树的深度

算法-树-反转二叉树相关推荐

  1. 让HomeBrew作者面试谷歌翻车的经典算法题 反转二叉树 Node.js 版

    var invertTree = function(root) {if(root === null){return root}let tmpLeft = root.left;root.left = r ...

  2. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

  3. 数据结构与算法——树与二叉树详细分享

    一.树 1.定义:由n个有限节点组成一个具有层次关系的集合,看起来像一颗倒挂的树,特点: 2.特点: a.每个节点有0个或多个子节点 b.没有父节点的节点称为根节点(A) c.每一个非根节点有且只有一 ...

  4. Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)

    目录 一.树 二.二叉树 树和前面所讲的表.堆栈和队列等这些线性数据结构不同,树不是线性的.在处理较多数据时,使用线性结构较慢,而使用树结构则可以提高处理速度.不过,相对于线性的表.堆栈和队列等线性数 ...

  5. 数据结构与算法 | 树与二叉树

    树的概念 二叉树的概念 树的概念和结构 树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,如图所示 有一个特殊的结点,称为根节点,根节点没 ...

  6. 【LeetCode-面试算法经典-Java实现】【226-Invert Binary Tree(反转二叉树)】

    [226-Invert Binary Tree(反转二叉树)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 代码下载[https://github.com/Wang-Jun- ...

  7. 二叉树常见算法题(单值二叉树、二叉树的最大深度、反转二叉树、判断两颗二叉树是否相同、对称二叉树、一颗二叉树是否是另一颗二叉树的子树)

    这里的代码都是递归实现的,再强调下二叉树的概念,二叉树的构成有两种情况: 1.空树 2.根节点 + 左子树 + 右子树(这里的左子树和右子树又是一颗二叉树) 可以看出二叉树就是递归定义的,下面的算法题 ...

  8. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  9. 我的软考之路(四)——数据结构与算法(2)之树与二叉树

    上篇博文主要介绍的是数据结构的线性结构,我们这篇博文介绍非线性结构-树与二叉树,我先介绍树的一些基本概念,树的遍历,再介绍二叉树相关概念和特性,以及二叉树的遍历,最后再树与二叉树的对比,总结. 树为了 ...

最新文章

  1. 分支1-CentOS6.5下 正/反向域名解析之yum安装/编译安装 的教程
  2. 真「祖传代码」!你的GitHub代码已打包运往北极,传给1000年后人类
  3. Mysql 导入导出csv 中文乱码问题的解决方法
  4. DELL 通过iDrac安装ESXI
  5. 仿LordPE获取PE结构
  6. PPT | 云客堂——云服务助力Java 应用程序开发及部署
  7. 给窗口添加背景图的案例
  8. request 和require区别_JAVA WEB开发中涉及到的get和post请求,他们的区别
  9. a1277以太网适配器驱动_福禄克DSX系列工业以太网连接器集锦
  10. 伟创ac80b变频器故障代码_安川变频器故障代码和安川变频器报警详解
  11. 计算机无法读取tf卡,为什么电脑不识别TF卡?
  12. c++ 的interface
  13. 蛋壳梦破:CEO被限制消费,资金链碎了一地
  14. 下一轮WiFi革命来临:详解高通MU-MIMO技术(Multi-User Multiple-Input Multiple-Output多用户多入多出技术)
  15. 悟透JavaScript-对象素描
  16. docker: 打包h5项目的镜像
  17. 什么是客户端容器化?
  18. echarts图表显示相关
  19. creator 挖洞 转发
  20. Dreamweaver8加载站点缓存时卡死,解决办法:

热门文章

  1. 用计算机解决问题的例子,电脑故障经典案例与解决方法20个
  2. 企业购买邮件服务器妙招
  3. 数字化时代的探索,企业如何做好数字化转型?
  4. vue 公众号开发跳转小程序的实现
  5. 唱片公司应该与时俱进而不是告迅雷
  6. ZCU106 XRT环境搭建【Xilinx Vitis】
  7. Android Design Support Library--简约而不简单的SnackBar
  8. VS Code安装更新失败解决方案
  9. 矢量控制之电流解耦环节
  10. 小米笔记本Pro 2020款 显卡MX350 CUDA+cuDNN tensorflow-gpu安装