1、问题描述
输入一棵二叉搜索树,将该二叉树转换成一个排序的双向链表。要求不能创建新的节点,只能调整树中节点指针的指向。例如,输入下面的一棵二叉树,则输出转换之后的排序双向链表。
2、解题思路
- 边界条件:二叉搜索树的头节点为空;
- 思路1:把树中每一个节点的左指针作为双向链表中该节点的前向指针,右指针作为双向链表中该节点的后向指针。由于要求转换后的双向链表是排好序的,所以可以中序遍历树中的每一个节点。当遍历到根节点时,可以把树看成三部分:值为10的根节点,根节点值为6的左子树和根节点值为14的右子树,在转换时,根节点将和左子树的最大一个节点(节点8)连接起来,同时它还将和右子树的最小节点(节点12)连接起来。
- 按照中序遍历的顺序,当我们转换到根节点时,其左子树已经转换成了一个排序的双向链表。并且处于链表的最后一个节点是左子树中值最大的节点。我们把链表的最后一个节点和根节点连接起来,此时,链表中的最后一个节点是根节点。接着我们去遍历转换右子树,然后把右子树中的最小节点和根节点连接起来。
3、代码实现
# -*- 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
pLastNodeInList = None
pLastNodeInList = self.ConvertNode(pRootOfTree, pLastNodeInList)
pHeadOfList = pLastNodeInList
while pHeadOfList != None and pHeadOfList.left != None:
pHeadOfList = pHeadOfList.left
return pHeadOfList
def ConvertNode(self,pRoot, pLastNodeInList):
if pRoot == None:
return
pCurrent = pRoot
if pCurrent.left != None:
pLastNodeInList = self.ConvertNode(pCurrent.left, pLastNodeInList)
pCurrent.left = pLastNodeInList
if pLastNodeInList != None:
pLastNodeInList.right = pCurrent
pLastNodeInList = pCurrent
if pCurrent.right != None:
pLastNodeInList = self.ConvertNode(pCurrent.right, pLastNodeInList)
return pLastNodeInList