输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
具体代码实现如下:
/*
// 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;
}
};
*/
// 二叉搜索树的中序遍历结果就是一个升序的数组。利用这一特点,再加上首尾相连。
// 设置连个指针,pre,cur
// pre:用来记录当前节点的上一个节点(最关键的就是这个pre了)
// head:用来记录二叉树最左下角的最小值,也就是链表的头部
class Solution {
Node pre = null;
Node head = null;
public Node treeToDoublyList(Node root) {
if(root == null) return null;
// 先来个中序遍历
inOrder(root);
head.left = pre;// 头结点的上一个结点(左边)为最后一个结点
pre.right = head;// 最后一个结点的下一个结点(右边)为头节点
return head;
}
public void inOrder(Node root){
if(root == null) return ; // 递归出口条件
inOrder(root.left);// 递归左子树
if(pre == null){// pre表示当前节点的上一个节点,只有头节点的上一个节点为空
head = root;// 标记头节点
pre = root;// pre更新(向后移动)
}else{
pre.right = root;// 前一个结点的下一个结点(右边)为当前结点,将其进行连接
root.left = pre;// 当前结点的上一个结点(左边)为上一个结点,将其进行连接
pre = root;// 更新pre
}
inOrder(root.right);// 递归右子树
}
}
人生若只如初见,何事秋风悲画扇。
等闲变却故人心,却道故人心易变。
-----------纳兰性德
小白寄语:学如逆水行舟,不进则退。