Python二叉搜索树与双向链表转换算法示例


Posted in Python onMarch 02, 2019

本文实例讲述了Python二叉搜索树与双向链表转换算法。分享给大家供大家参考,具体如下:

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

普通的二叉树也可以转换成双向链表,只不过不是排序的

思路:

1. 与中序遍历相同

2. 采用递归,先链接左指针,再链接右指针

代码1,更改doubleLinkedList,最后返回list的第一个元素:

class TreeNode:
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None
class Solution:
  def lastElem(self, list):
    if len(list) == 0:
      return None
    else: return list[len(list) - 1]
  def ConvertCore(self, pRoot, doubleLinkedList):
    if pRoot:
      if pRoot.left:
        self.ConvertCore(pRoot.left, doubleLinkedList)
      pRoot.left = self.lastElem(doubleLinkedList)
      if self.lastElem(doubleLinkedList):
        self.lastElem(doubleLinkedList).right = pRoot
      doubleLinkedList.append(pRoot)
      if pRoot.right:
        self.ConvertCore(pRoot.right, doubleLinkedList)
  def Convert(self, pRootOfTree):
    if pRootOfTree == None:
      return None
    doubleLinkedList = []
    self.ConvertCore(pRootOfTree, doubleLinkedList)
    return doubleLinkedList[0]

代码2,lastListNode指向双向链表中的最后一个节点,因此每次操作最后一个节点。这里要更改值,因此采用list的形式。

class TreeNode:
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None
class Solution:
  def ConvertCore(self, pRoot, lastListNode):
    if pRoot:
      if pRoot.left:
        self.ConvertCore(pRoot.left, lastListNode)
      pRoot.left = lastListNode[0]
      if lastListNode[0]:
        lastListNode[0].right = pRoot
      lastListNode[0] = pRoot
      if pRoot.right:
        self.ConvertCore(pRoot.right, lastListNode)
  def Convert(self, pRootOfTree):
    # write code here
    if pRootOfTree == None:
      return None
    lastListNode = [None]
    self.ConvertCore(pRootOfTree, lastListNode)
    while lastListNode[0].left:
      lastListNode[0] = lastListNode[0].left
    return lastListNode[0]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python在windows下实现备份程序实例
Jul 04 Python
Python实现的检测web服务器健康状况的小程序
Sep 17 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
Python unittest模块用法实例分析
May 25 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
python中watchdog文件监控与检测上传功能
Oct 30 Python
Python实现的序列化和反序列化二叉树算法示例
Mar 02 #Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 #Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 #Python
python实现转圈打印矩阵
Mar 02 #Python
python实现顺时针打印矩阵
Mar 02 #Python
python实现二维数组的对角线遍历
Mar 02 #Python
python实现矩阵打印
Mar 02 #Python
You might like
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
Ruffy javascript 学习笔记
2009/11/30 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
详解Vue爬坑之vuex初识
2017/06/14 Javascript
JS实现给json数组动态赋值的方法示例
2020/03/19 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
总结JavaScript在IE9之前版本中内存泄露问题
2018/04/28 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python中的闭包详细介绍和实例
2014/11/21 Python
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
Python list操作用法总结
2015/11/10 Python
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
详解flask入门模板引擎
2018/07/18 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
国际商务专业学生个人的自我评价
2013/09/28 职场文书
物业保安主管岗位职责
2013/12/25 职场文书
写自荐信三大法宝
2014/01/24 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
婚庆司仪主持词
2014/03/15 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
六年级学生评语
2014/04/22 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
关于清明节的演讲稿2015
2015/03/18 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书