jz36.二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点

题解

DFS递归

这道题明显是要用到二叉搜索树中序遍历递增的性质.

思路与反转链表一样, 每遍历到一个节点, 假设当前节点是cur , 之前的节点是pre, 那么令pre.right = cur, cur.left = pre. 然后更新pre 的位置, 令pre=cur, 而cur会随着递归过程自动更新位置

如果遍历当前pre为空, 那么说明这是遍历到的第一个节点, 记为head, 全部遍历完成后, pre就是尾部节点, 将这两个节点相连即可构成双循环链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
Node pre = null;
Node head = null;

public Node treeToDoublyList(Node root) {
if (root == null)
return root;

dfs(root);
head.left = pre;
pre.right = head;

return head;

}

private void dfs(Node cur) {
if (cur == null)
return;

dfs(cur.left);
if (pre == null)
head = cur;
else {
pre.right = cur;
cur.left = pre;
}

pre = cur;
dfs(cur.right);
}
}
-------------本文结束感谢您的阅读-------------
可以请我喝杯奶茶吗