题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
方法一:非递归版解题思路:
1.核心是中序遍历的非递归算法。
2.修改当前遍历节点与前一遍历节点的指针指向
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def NodeList(self,pRootOfTree):
if not pRootOfTree:
return [] #这里返回的是[] 不是None
else:
return self.NodeList(pRootOfTree.left)+[pRootOfTree]+self.NodeList(pRootOfTree.right) #[pRootOfTree]注意加[]
def Convert(self, pRootOfTree):
# write code here
res = self.NodeList(pRootOfTree)#返回的是二叉树 ,所以[pRootOfTree]而不是[pRootOfTree.val] (列表返回)
if len(res)==0:
return None
if len(res)==1:
return pRootOfTree
res[0].left = None
res[0].right = res[1]
res[-1].right = None
res[-1].left = res[-2]
for i in range(1,len(res)-1):
res[i].left = res[i-1]
res[i].right = res[i+1]
return res[0] #返回res[0]
方法二:递归版
将左子树构成双链表
根与左子树最大节点相连
将右子树构成双链表
根与右子树最小节点相连
返回左子树最小节点
代码参考 pdd搬砖工:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
# write code here
if not pRootOfTree :
return pRootOfTree
if not pRootOfTree.left and not pRootOfTree.right:
return pRootOfTree
self.Convert(pRootOfTree.left)
left = pRootOfTree.left
# 连接根与左子树最大结点
if left:
while left.right:
left = left.right
pRootOfTree.left,left.right = left,pRootOfTree
self.Convert(pRootOfTree.right)
right = pRootOfTree.right
# 连接根与右子树最小结点
if right:
while(right.left):
right=right.left
pRootOfTree.right,right.left = right,pRootOfTree
while pRootOfTree.left:
pRootOfTree = pRootOfTree.left
return pRootOfTree