把二叉搜索树转换为一个有序循环双向链表
时间: 2024-02-12 11:05:14 浏览: 99
二叉树转换为双向链表
这个问题可以使用递归来解决,具体步骤如下:
1. 将左子树转换为有序循环双向链表,并返回链表的头节点和尾节点。
2. 将右子树转换为有序循环双向链表,并返回链表的头节点和尾节点。
3. 将根节点插入到左子树的尾节点和右子树的头节点之间,并更新链表的头节点和尾节点。
4. 最后将链表的头节点和尾节点相互连接,形成一个循环链表。
代码如下:
```python
class Node:
def __init__(self, val=None, left=None, right=None):
self.val = val
self.left = left
self.right = right
def treeToDoublyList(root):
if not root:
return None
def dfs(node):
if not node:
return None, None
left_head, left_tail = dfs(node.left)
right_head, right_tail = dfs(node.right)
# 将根节点插入到左子树的尾节点和右子树的头节点之间
if left_tail:
left_tail.right = node
node.left = left_tail
else:
left_head = node
if right_head:
right_head.left = node
node.right = right_head
else:
right_tail = node
# 连接链表的头节点和尾节点
left_head.left = right_tail
right_tail.right = left_head
return left_head, right_tail
head, tail = dfs(root)
return head
```
这个算法的时间复杂度是 O(n),其中 n 是二叉搜索树的节点数。因为每个节点都会被访问一次,所以时间复杂度是线性的。空间复杂度是 O(n),因为需要使用递归栈来存储每个节点。
阅读全文