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 fabric使用笔记
May 09 Python
深入理解Python中装饰器的用法
Jun 28 Python
手把手教你python实现SVM算法
Dec 27 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
python爬虫可以爬什么
Jun 16 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
python实现excel公式格式化的示例代码
Dec 23 Python
Python requests库参数提交的注意事项总结
Mar 29 Python
Python基于Opencv识别两张相似图片
Apr 25 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/10/09 PHP
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
用vue写一个日历
2020/11/02 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python面向对象进阶学习
2019/05/21 Python
Python 项目转化为so文件实例
2019/12/23 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
校园新闻广播稿
2014/01/10 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
团拜会策划方案
2014/06/07 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
基于CSS3画一个iPhone
2021/04/21 HTML / CSS
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技