思路:迭代的中序遍历 + 维护遍历过程中的pre节点与curr节点
public static Tree solution(Tree head){
Tree p = head;
Tree pre = null;//中序遍历的前驱节点
Tree curr = null;//中序遍历的当前节点
Tree res = null;//指向虚拟双向链表的头节点
boolean isHead = false;
Deque<Tree> stack = new LinkedList<>();
while(!stack.isEmpty() || p != null){
while(p != null){
stack.push(p);
p = p.left;
}
p = stack.pop();
if(!isHead){
res = p;
isHead = true;
}
pre = curr;
curr = p;
if(pre != null){
pre.right = curr;
}
curr.left = pre;
p = p.right;
}
//将头尾连接起来形成一个双向循环链表
res.left = curr;
curr.right = res;
return res;
}