package leetcode;
public class offer_36 {
//全局变量保存头结点和上一个结点
Node preNode,head;
public Node treeToDoublyList(Node root) {
if(root==null) {
return null;
}
order(root);
//循环双向链表,前驱头结点的前驱是尾结点,尾结点的后继是头结点
preNode.right=head;
head.left=preNode;
return head;
}
//中序遍历
public void order(Node root) {
//表示递归结束
if(root==null) {return;}
order(root.left);
//preNode为空,表示是头结点
if(preNode==null) {
head=root;
}else {
//表示为中间结点为中间结点,记录当前节点为上一个结点的后继结点
preNode.right=root;
}
//记录上一个结点为当前结点的前驱节点
root.left=preNode;
//保留当前结点
preNode=root;
order(root.right);
}
}