题目描述:输入一颗二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能有新的结点,只能调整结点的指向。
思路:转换后的双向链表中结点的顺序与二叉树的中序遍历相同,因此本质就是写一个二叉树的中序遍历,再写一个双向链表的插入。
写成递归会方便一些,非递归的形式也有,不过我没写出来。
代码:
# offer32-solution
class Solution:
def Convert(self, pRootOfTree):
if not pRootOfTree:
return
root = pHead = pRootOfTree
while pHead.left:
pHead = pHead.left # 链表从最左节点出发
self.Core(root) # 进入递归
return pHead
def Core(self, root):
if not root.left and not root.right: # 子节点
return
if root.left:
preRoot = root.left
self.Core(root.left) # 递归
while preRoot.right:
preRoot = preRoot.right # 调整指针,构成双向链表
preRoot.right = root # preroot的右边连向root
root.left = preRoot # root的左边连向preroot ,完成了左子树的递归
if root.right:
nextRoot = root.right
self.Core(root.right)
while nextRoot.left:
nextRoot = nextRoot.left
nextRoot.left = root
root.right = nextRoot