把二叉搜索树转化为双链表
时间: 2023-07-24 12:11:01 浏览: 81
将二叉搜索树转化为双链表需要进行中序遍历,并且在遍历的过程中修改节点的指针指向。
具体步骤如下:
1. 定义一个递归函数convert,用于进行中序遍历,并修改节点指针指向。函数接受一个参数root,表示当前节点。
2. 在convert函数中,先递归遍历左子树,将左子树转化为双链表,并将左子树的最后一个节点与当前节点相连。
3. 如果当前节点的左子树不为空,则将当前节点的前驱指针指向左子树的最后一个节点。
4. 如果当前节点的前驱节点不为空,则将前驱节点的后继指针指向当前节点。
5. 递归遍历右子树,将右子树转化为双链表,并将当前节点与右子树的第一个节点相连。
6. 最后返回双链表的头节点,即为中序遍历的第一个节点。
完整代码如下:
```
class Node:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
self.prev = None
self.next = None
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:
return None
self.prev = None
head = self.convert(root)
tail = head
while tail.next:
tail = tail.next
head.prev = tail
tail.next = head
return head
def convert(self, root):
if not root:
return None
left = self.convert(root.left)
cur = Node(root.val)
if left:
left_prev = left
while left_prev.next:
left_prev = left_prev.next
left_prev.next = cur
cur.prev = left_prev
if self.prev:
self.prev.next = cur
cur.prev = self.prev
self.prev = cur
right = self.convert(root.right)
if right:
right_prev = right
while right_prev.prev:
right_prev = right_prev.prev
cur.next = right_prev
right_prev.prev = cur
return left if left else cur
```
阅读全文