二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求值的顺序保持不变,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。
返回转换后的单向链表的头节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binode-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————————
解题思路:这一题使用到二叉搜索树的中序遍历是有序数组的性质,使用一个变量记录当前节点的中序遍历的上一个节点。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def __init__(self):
self.nums = self.curs = TreeNode(0) # 用于保存当前节点的上一个节点,同时用于保存初始位置节点
def convertBiNode(self, root: TreeNode) -> TreeNode:
if not root: # 如果节点为空,直接返回None
return None
if root.left: # 左子树进行中序遍历
self.convertBiNode(root.left)
self.curs.right = root # 对当前节点进行拼接
root.left = None # 将当前节点的左子树变为空
self.curs = self.curs.right # 更新当前节点的上一个结点值
if root.right:
self.convertBiNode(root.right)
return self.nums.right 返回头结点的下一个节点
因为需要遍历每个节点,因此时间复杂度为O(n)。递归次数为二叉树的层数,因此空间复杂度为O(logn)。