剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)_第1张图片

思路

详见链接

代码

#class Node:
#	def __init__(self, val, left=None, right=None):
#		self.val = val
#		self.left = left
#		self.right = right
		
class Solution:
	def treeToDoublyList(self,root:'None')->'Node':
		def dfs(cur):
			if not cur: return 
			dfs(cur.left)
			if self.pre:
				self.pre.right, cur.left = cur, self.pre
			else:
				self.head = pre
			self.pre = cur   #指针后移
			dfs(cur.right)
		if not root: return 
		self.pre = None
		dfs(root)
		self.head.left, self.pre.right= self.pre, self.head
		return self.head

复杂度

时间复杂度 O(N) : N为二叉树的节点数,中序遍历需要访问所有节点。
空间复杂度 O(N) : 最差情况下,即树退化为链表时,递归深度达到 N,系统使用 O(N) 栈空间。

你可能感兴趣的:(剑指offer)