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的循环体中使用else语句的方法
Mar 30 Python
python创建一个最简单http webserver服务器的方法
May 08 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
Aug 12 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
pytorch 常用线性函数详解
Jan 15 Python
python函数调用,循环,列表复制实例
May 03 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
Python爬取酷狗MP3音频的步骤
Feb 26 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静态类
2006/11/25 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
深入浅析php json 格式控制
2015/12/24 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
js数字转换为float,取N位小数
2014/02/08 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
js继承call()和apply()方法总结
2014/12/08 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
JavaScript Split()方法
2015/12/18 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
2016/12/29 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
编写多线程Python服务器 最适合基础
2018/09/14 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
简单了解python变量的作用域
2019/07/30 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
某公司.Net方向面试题
2014/04/24 面试题
线程同步的方法
2016/11/23 面试题
员工自我鉴定范文
2013/10/06 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
网络维护中文求职信
2014/01/03 职场文书
医疗器械售后服务承诺书
2014/05/21 职场文书
听证通知书
2015/04/24 职场文书