题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出
输入描述:
二叉树的根节点
返回值描述:
双向链表的其中一个头节点。
示例1
输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
说明:输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。
1、递归版本
class Solution:
def Convert(self , pRootOfTree ):
# write code here
if not pRootOfTree:
return None
if pRootOfTree and not pRootOfTree.left and not pRootOfTree.right:
return pRootOfTree
# 将左子树构建成双链表,返回链表头
left=self.Convert(pRootOfTree.left)
p=left
# 定位至左子树的最右的一个结点
while left and p.right:
p=p.right
# 如果左子树不为空,将当前root加到左子树链表
if left:
p.right=pRootOfTree
pRootOfTree.left=p
# 将右子树构造成双链表,返回链表头
right=self.Convert(pRootOfTree.right)
# 如果右子树不为空,将该链表追加到root结点之后
if right:
right.left=pRootOfTree
pRootOfTree.right=right
return left if left else pRootOfTree
2、中序遍历得到一个数组,然后构造出双向链表
class Solution:
def Convert(self , pRootOfTree ):
# write code here
if not pRootOfTree:
return None
minRes = []
def midTraverse(root):
if not root:
return None
midTraverse(root.left)
minRes.append(root)
midTraverse(root.right)
midTraverse(pRootOfTree)
# 主要是利用v和minRes两种表示法来改变双向链表的指针
for k,v in enumerate(minRes[0:len(minRes)-1]):
v.right = minRes[k+1]
minRes[k+1].left = v
print(minRes)
return minRes[0]