《剑指offer》二叉搜索树和双向链表

本题来自《剑指offer》 二叉搜索树和双向链表

题目:

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

思路:

  采用分治的思想,将一个大的问题分解成较小的几个问题,再分别解决完后合并。

   将树分成三部分,根,左子树,右子树,将左子树中最大的节点,根节点和右子树最小的节点连接起来。

  寻找左子树最大节点和右子树最小节点采用递归,思路既可以

C++ Code:(尚未解决)

Python Code:(这个思路借助了辅助存储,不合要求)

# -*- 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:                             #判断边界条件,判空
            res = []                                #用于存放中序的节点        
            res = self.InOrder(res,pRootOfTree)     #中序遍历
            for index in range(len(res)-1): 
                if res[index]:                      #当节点不空进入
                    res[index].right = res[index+1] #前向串联
                    res[index+1].left = res[index]  #反向串联
            return res[0]                           #返回头结点
        else:                                       #若为空直接返回
            return None
                                                    #递归的中序遍历
    def InOrder(self,res,pRootOfTree):
        if pRootOfTree: 
            self.InOrder(res,pRootOfTree.left)      #遍历左子节点
            res.append(pRootOfTree)                 #将根节点加入到列表中
            self.InOrder(res,pRootOfTree.right)     #遍历右子节点
        return res

总结:

原文地址:https://www.cnblogs.com/missidiot/p/10783636.html