剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(LeetCode)
由题可得这是一个中序遍历,即在出栈时访问该节点
创建一个新的链表最为方便,所以创建一个新链表
创建一个head节点,让head指向第一个节点
在中序遍历的途中,设置两个指针,一个pre指向新建链表当前的节点,cur指向当前要进入链表的节点
1.创建链表,创建头指针head
2.创建栈,将根节点进入节点
3.进行中序遍历
3.5为了防止指针指示错误,先将第一个节点找出来,用head指向它
4.在中序遍历途中,出栈时将cur指向当前出栈元素,将pre的right(后继)指向cur,cur的left(前继)指向pre,并将pre指向当前出栈节点
5.cur或pre指向同一个元素,必定在循环完之后指向最后一个元素
注4为相关操作
public Node treeToDoublyList(Node root) {
if(root == null)
return root;
Stack<Node> stack = new Stack<>();
stack.push(root);
//为了防止指针指示错误,先将第一个节点找出来,用head指向它
Node head,pre=null,cur = null;
while (stack.peek().left!=null){
stack.push(stack.peek().left);
}
head = stack.peek();
pre = stack.peek();
while (!stack.isEmpty()){
while (stack.peek().left!=null){
stack.push(stack.peek().left);
}
while (!stack.isEmpty()&&stack.peek().right==null){
Node node = stack.pop();
//执行相关操作
// 出栈时将cur指向当前出栈元素,将pre的right(后继)指向cur,cur的left(前继)指向pre,并将pre指向当前出栈节点
cur = node;
pre.right = cur;
cur.left = pre;
pre = cur;
}
if (!stack.isEmpty()) {
Node node = stack.pop();
stack.push(node.right);
//执行相关操作
cur = node;
pre.right = cur;
cur.left = pre;
pre = cur;
}
}
//处理头指针,与尾指针
head.left = cur;
cur.right = head;
return head;
}