本题来自《剑指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