输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
- 需要返回双向链表最左侧的节点
解析:递归,分别处理左右子树。
注意:根据二叉搜索树的特性,需要进行两个操作,1)在左子树a时,需要判断该左子树a所有的右子树到叶子节点a1,让该叶子节点a1指向a;2)在右子树b时,需要判断该右子树b所有的左子树到叶子节点b1,让该叶子节点b1指向b。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def convert(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
if not root:
return None
root = self.convert_tree(root)
while root.left:
root = root.left
return root
def convert_tree(self , node):
if not node:
return None
if node.left:
left = self.convert_tree(node.left)
while left.right: # 判断该左子树的所有右叶子节点,再指向该左子树的节点。
left = left.right
left.right = node
node.left = left
if node.right:
right = self.convert_tree(node.right)
while right.left: # 判断该右子树的所有左叶子节点,再指向该右子树的节点
right = right.left
right.left = node
node.right = right
return node