题目来源:力扣
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
审题:
题目要求我们将一棵二叉搜索树转化为双向循环链表.由于二叉搜索树的中序遍历结果递增有序,因此我们可以考虑中序处理每一个节点,相当于我们从头构建双向循环链表.我们可以先构建一个双向链表,然后在将链表的首尾节点相连,构成双向循环链表.
为了构建双向链表,我们维护一个节点变量prev
,当我们中序处理当前节点时,该节点的前驱节点为prev
节点,而prev
节点的后继节点则为当前节点,然后将prev
节点更新为当前节点.当中序遍历完节点后,prev
节点为最后一个节点,然后我们将首尾相连,即可构成一个双向循环链表.
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val,Node _left,Node _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
//对二叉搜索树进行中序遍历
Node prev;
//对节点进行中序遍历,逐一处理
private Node dfs(Node x){
System.out.println(x.val);
Node head; //头节点
if(x.left != null){ //处理左节点, 此时当前节点称为next节点
head = dfs(x.left);
}
else
head = x;
//处理当前节点, 此时当前节点称为prev节点
x.left = prev;
if(prev != null)
prev.right = x;
prev = x;
if(x.right != null){
dfs(x.right);
}
return head;
}
public Node treeToDoublyList(Node root) {
if(root == null)
return null;
prev = null;
Node head = dfs(root);
//首尾相连
head.left = prev;
prev.right = head;
return head;
}
}