题目描述(题目链接)
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
求解思路
中序遍历同时构建双向链表,用head指针保存链表的第一个节点,用tail指针保存前一个节点(用来构建前后节点之间的关系)。
代码
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:37.8 MB, 在所有 Java 提交中击败了61.97%的用户
/*
// 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 head = new Node(0); //头指针,指向链表的第一个节点
Node tail = null; //前一个指针
public Node treeToDoublyList(Node root) {
if(root==null)return null;
converse(root); //中序遍历同时构建双向链表
head.right.left = tail; //最后将第一个节点的left指向最后一个节点
tail.right = head.right; //将最后一个节点的right指向第一个节点
return head.right; //返回第一个节点
}
void converse(Node root){
if(root.left!=null)converse(root.left); //左子树不为空,遍历左子树
if(tail==null){ //第一个节点
head.right = root; //head指向第一个节点
tail = root; //tail更新
}else{
tail.right = root; //前一个节点的right为当前节点
root.left = tail; //当前节点的left为前一个节点
tail = root; //tail更新
}
if(root.right!=null)converse(root.right); //右子树不为空,遍历右子树
}
}