当前位置: 首页 > news >正文

114. Flatten Binary Tree to Linked List (leetcode)

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1
        / \
       2   5
      / \   \
     3   4   6

The flattened tree should look like:

   1
    \
     2
      \
       3
        \
         4
          \
           5
            \
             6

 

 

要求是in-place的修改, 所以只能通过遍历和修改左右节点的引用来实现, 提示中说如果是前序遍历的话, 右边节点的前一个节点就是需要连接过去的目标.

照着这个思路, 需要在递归中获取的信息有: 当前节点是否是右节点, 当前节点的父节点.  然后通过处理变成一棵线性, 全部是左节点的树.

处理顺序是, 如果节点是右节点, 先把它添加为前一个节点的左节点, 然后修改父节点, 将父节点的右节点置为空.  

最后将左倾树变化为目标形式.

python 代码:

 

 1 class Solution(object):
 2     def __init__(self):
 3         self.prev = None
 4         
 5     def flatten(self, root):
 6         """
 7         :type root: TreeNode
 8         :rtype: void Do not return anything, modify root in-place instead.
 9         """
10         self.deal(root, None, False)
11         self.moveLeftToRight(root)
12 
13     def deal(self, node, parent, isRight):
14         if not node:
15             return
16         if isRight:
17             parent.right = None
18             self.prev.left = node
19             
20         self.prev = node
21         self.deal(node.left, node, False)
22         self.deal(node.right, node, True)
23         
24     def moveLeftToRight(self, node):
25         while node:
26             left = node.left
27             node.left = None
28             node.right = left
29             node = left
30         

 

后来翻看别人的解答时, 发现了一个很棒的方法.

思路是: reversed pre-order,  从右往左遍历, 已demo为例顺序是 6->5->4->3->2->1, 记录下前一个节点后, 将其添加为当前节点的右节点, 然后左节点为空. 递归完毕后就是一棵右倾树了.

 

 1 def __init__(self):
 2     self.prev = None
 3     
 4 def flatten(self, root):
 5     if not root:
 6         return None
 7     self.flatten(root.right)
 8     self.flatten(root.left)
 9     
10     root.right = self.prev
11     root.left = None
12     self.prev = root

https://discuss.leetcode.com/topic/33192/8-lines-of-python-solution-reverse-preorder-traversal/2

 

(完)

 

转载于:https://www.cnblogs.com/tangkikodo/p/6658145.html

相关文章:

  • 大数据与应用统计学的区别与联系
  • 在ElasticSearch中使用 IK 中文分词插件
  • Ubuntu 16.04 中安装谷歌 Chrome 浏览器
  • SSH使用密钥免密码登录
  • Ajax和跨域问题
  • 使用HTML5的canvas做图片剪裁
  • java异常处理(Exception handing)机制
  • 四则运算 web 版
  • 201521123030 《Java程序设计》第7周学习总结
  • Ajax异步封装
  • 闭包与循环
  • iOS 字符串 MD5
  • 查看linux源代码的在线网站
  • Android入门:MVC模式(中)
  • Oracle中INSTR函数与SQL Server中CHARINDEX函数
  • 【css3】浏览器内核及其兼容性
  • Android Volley源码解析
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS6 编译安装 redis-3.2.3
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 分布式事物理论与实践
  • 给github项目添加CI badge
  • 关于 Cirru Editor 存储格式
  • 技术发展面试
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 三栏布局总结
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 译有关态射的一切
  • 应用生命周期终极 DevOps 工具包
  • 追踪解析 FutureTask 源码
  • 走向全栈之MongoDB的使用
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​io --- 处理流的核心工具​
  • ​VRRP 虚拟路由冗余协议(华为)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C语言)字符分类函数
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (四)模仿学习-完成后台管理页面查询
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转载)Google Chrome调试JS
  • .gitattributes 文件
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中让 Task 支持带超时的异步等待
  • .NET成年了,然后呢?
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接MySQL的方法