【剑指Offer】27二叉搜索树与双向链表

题目描述

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

时间限制:1秒;空间限制:32768K

解题思路

递归思路。先解决输入为空的特殊情况;遇到叶子节点则返回节点;左子树递归,将左子树转换后结果的最大值即最右的值与根节点的left连接;再将右子树递归,将右子树转换后结果的最小值即最左的值(链表头值)与根节点的right连接;最后返回的是左子树递归结果的链表头。

# -*- 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 pRootOfTree == None:
            return pRootOfTree
        if pRootOfTree.left==None and pRootOfTree.right==None:
            return pRootOfTree
        
        # 左子树递归
        left = self.Convert(pRootOfTree.left)
        p = left
        if left!= None:
            while p.right != None:
                p = p.right
            # 找到最大值,即最右的值,和根节点连接
            p.right = pRootOfTree
            pRootOfTree.left = p
            
        # 右子树递归
        right = self.Convert(pRootOfTree.right)
        if right!= None:
            # 找到最小值,即最左的值(链表头值)和根节点连接
            right.left = pRootOfTree
            pRootOfTree.right = right
        
        if left != None:
            return left
        else:
            return pRootOfTree

 

posted @ 2018-10-19 13:07  yucen  阅读(96)  评论(0编辑  收藏  举报