26.二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
记录
- 二叉搜索树
左子树不为空,则左子树上所有节点的值均小于它根节点的值
右子树不为空,则右子树上所有节点的值均大于它根节点的值
- 双向链表
同时有pre和next。
中序遍历,直接对二叉搜索树进行了排序。
大的框架是中序遍历。
定义两个辅助节点listHead(链表头节点)、listTail(链表尾节点)。listHead为链表的头节点,listTail为当前节点。
方法一:
- “左 中 右”
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.listHead = None
self.listTail = None
def Convert(self, pRootOfTree):
#常规判空
if pRootOfTree == None:
return None
#中序遍历的递归的第一部分
self.Convert(pRootOfTree.left)
#中序遍历的递归的第二部分(核心)
#设置链表的头节点和当前节点
if self.listHead == None:
self.listHead = pRootOfTree
self.listTail = pRootOfTree
else:
#构建双向
self.listTail.right = pRootOfTree
pRootOfTree.left = self.listTail
#更新当前节点到下一个节点
self.listTail = pRootOfTree
#中序遍历的递归的第三部分
self.Convert(pRootOfTree.right)
return self.listHead
- “右 中 左”
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.list = None
def Convert(self, pRootOfTree):
#常规判空
if pRootOfTree == None:
return None
#中序遍历的递归的第一部分
self.Convert(pRootOfTree.right)
#中序遍历的递归的第二部分(核心)
if self.list == None:
self.list = pRootOfTree
else:
#构建双向
self.list.left = pRootOfTree
pRootOfTree.right = self.list
#更新当前节点到下一个节点
self.list = pRootOfTree
#中序遍历的递归的第三部分
self.Convert(pRootOfTree.left)
return self.list
方法二:
先构造中序遍历的列表,然后将列表转变成双向链表。
# 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 not pRootOfTree:return
self.arr = []
self.midTraversal(pRootOfTree)
for index in range(len(self.arr) - 1):
#构建双向
self.arr[index].right = self.arr[index + 1]
self.arr[index + 1].left = self.arr[index]
return self.arr[0]
#中序遍历的递归实现
def midTraversal(self, root):
if not root: return
self.midTraversal(root.left)
self.arr.append(root)
self.midTraversal(root.right)