题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
第一,中序遍历二叉搜索树后再遍历一遍修改指针指向
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
# 中序遍历二叉搜索树,左指针指向前一个结点,右指针指向后一个结点
if not pRootOfTree:
return None
node = pRootOfTree
nodelist=[]
tree=[]
while len(nodelist)!=0 or node:
if node:
nodelist.append(node)
node=node.left
else:
node = nodelist.pop()
tree.append(node)
node=node.right
#按中序遍历二叉树序列调整指针指向
head = tree[0]
while tree:
node = tree.pop(0)
if tree:
node.right = tree[0]
tree[0].left = node
return head
第二,递归(参考大佬解法,留着以后加强理解)
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
if not pRootOfTree:
return None
root = pRootOfTree
leftHead = self.Convert(root.left)#先改变左子树,返回的是左子树根结点
if leftHead:
left = leftHead
while left.right:#找到左子树的最右边结点
left=left.right
left.right=root
root.left = left#根结点left指向左子树构成的链表最后一个结点
rightHead = self.Convert(root.right)#改变右子树,返回右子树的根结点
if rightHead:
root.right = rightHead
rightHead.left = root
if leftHead:
return leftHead
else:
return root