python 双向链表_剑指offer-36二叉搜索树与双向链表-python

《剑指offer》python实现系列,全目录

题目描述:

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

Snipaste_2020-03-17_22-18-40.png

第一想法

二叉搜索树的中序遍历就是升序输出,可惜没思路

网上的一种思路,这么简单都想不到(惭愧啊)

只需要中序遍历,将所有的节点保存到一个列表。对这个list进行遍历,每个节点的right设为下一个节点,下一个节点的left设为上一个节点。

剑指offer方法:

中序遍历树中的每个节点,当遍历到根节点的时候,我们把树看成3部分:值为10的节点根节点值为6的左子树:根节点值为14的右子树。

根据排序链表的定义值为10的节点将和它的左子树的最大一个节点(值为8的节点)链接起来,同时它还将和右子树最小的节点(值为12的节点)链接起来,如图所示

Snipaste_2020-03-17_23-17-25.png

按照中序遍历的顺序,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了(要从底部向根转换,不能从根向底部转),并且处在链表中的最后一个节点是当前值最大的节点。我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了。接着我们去遍历转换右子树,并把根节点和右子树中最小的节点链接起来。至于怎么去转换它的左子树和右子树,由于遍历和转换过程是一样的,我们很自然地想到可以用递归。

在中序遍历的基础上修改,定义preNode指向已转换好的链表的最后一结点,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23class Solution:

def Convert(self, pRootOfTree):

def convertCore(root):

#在中序遍历的基础上修改

if root is None:

return

convertCore(root.left)

root.left = preNode[0]

if preNode[0]:

preNode[0].right = root

preNode[0] = root

convertCore(root.right)

if pRootOfTree is None:

return None

pHead = pRootOfTree

while pHead.left: #找转换后的头节点

pHead = pHead.left

preNode = [None] #注意使用list做参数

convertCore(pRootOfTree)

return pHead

关于做函数参数,是否会修改原身。涉及到可变对象,不可变对象。是否在函数内重新赋值问题,比较复杂,建议看下可变对象一节的例子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值