题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
- 要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
思路
对于一棵二叉搜索树,其中序遍历结果为升序的有序结果,以例中的二叉搜索树为例,其中序遍历结果为[4,6,8,10,12,14,16]。
由于题中要求不能创建新的结点,且只能调整树中结点指针的指向,故可以将树的节点按照中序遍历的顺序记录在列表中,再遍历该列表,将当前节点的右指针指向下一个节点,下一个节点的左指针指向当前节点,最后返回节点列表的首元素即可。
代码实现
class Solution(object):
def convert(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if root is None:
return root
res = []
def inorder(root): # 中序遍历
if not root:
return
inorder(root.left)
res.append(root) # 按照中序遍历顺序记录对应节点
inorder(root.right)
inorder(root)
for i, node in enumerate(res[:-1]):
node.right = res[i+1] # 当前节点的右指针指向下一个节点
res[i+1].left = node # 下一个节点的左指针指向当前节点
return res[0] # 返回双向链表首节点