# 题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例👇
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
👇 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点
# 思路
中序遍历dfs
,使用pre
来记录前一个节点,从而模拟双向链表的pre
和next
指针的指向,最后再处理最后一个节点,从而构成双向循环列表
# 代码实现
/**
* // Definition for a Node.
* function Node(val,left,right) {
* this.val = val;
* this.left = left;
* this.right = right;
* };
*/
/**
* @param {Node} root
* @return {Node}
*/
var treeToDoublyList = function(root) {
// 深度模拟中序遍历
function dfs(root){
// 判断叶子结点
if(root == null){
return null;
}
dfs(root.left);
pre == null ? head = root : pre.right = root;
root.left = pre; // 当前节点左指针指向前一个结点
pre = root; // 移动pre到下一个
dfs(root.right);
}
var pre = null, head = null;
if(!root){
return root;
}
dfs(root);
// 处理最后一个节点 —— 构成环
head.left = pre;
pre.right = head;
return head;
};
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
33
34
35
36
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
33
34
35
36