题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
原题比较长,可以去力扣看。大致题意是将二叉排序树转换成有序的双向循环链表。
思路
题目要求递增的循环链表,即按中序遍历二叉树。判断特殊情况,如果传入节点为空,则直接返回。记录下第一个节点为head。遍历过程中依次连接【前一节点】和【当前节点】。最后将head节点和尾节点连接,返回head节点即可。
代码
class Solution {
Node head;
public Node treeToDoublyList(Node root) {
if (root == null) return null;
Node p = root;
Node pre = root;
Stack<Node> stack = new Stack<>();
while (p != null || !stack.isEmpty()) {
if (p != null) {
stack.push(p);
p = p.left;
} else {
p = stack.pop();
if (head == null) {
head = p;
} else {
pre.right = p;
p.left = pre;
}
pre = p;
p = p.right;
}
}
pre.right = head;
head.left = pre;
return head;
}
}