题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
解题思路
- 中序遍历BFS
- 当前节点与前一个节点建立双向链接
- 头节点与尾节点建立双向链接
代码
/*
// 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 {
private Node head, prev;
public Node treeToDoublyList(Node root) {
if (root == null) return root;
dfs(root);
// 头节点指向尾节点
head.left = prev;
// 尾节点指向头节点
prev.right = head;
return head;
}
private void dfs(Node node) {
if (node == null) return;
dfs(node.left);
// 赋值头结点
if (head == null) head = node;
// 当前节点与前一个节点建立双向链接
if (prev != null) {
prev.right = node;
node.left = prev;
}
prev = node;
dfs(node.right);
}
}