题目地址:
https://www.lintcode.com/problem/convert-binary-search-tree-to-sorted-doubly-linked-list/description
给定一个二叉搜索树,要求将其转为双向循环链表,将每个节点的right指针视为双向链表节点的next指针,left视为prev,并且链表的次序关系恰好是二叉搜索树里的中序遍历的前驱后继关系。返回二叉搜索树的最小的节点。
思路是用栈做中序遍历,然后将节点一个个append上去。代码如下:
import java.util.Deque;
import java.util.LinkedList;
public class Solution {
/**
* @param root: root of a tree
* @return: head node of a doubly linked list
*/
public TreeNode treeToDoublyList(TreeNode root) {
// Write your code here.
if (root == null) {
return null;
}
Deque<TreeNode> stack = new LinkedList<>();
TreeNode dummy = new TreeNode(0), prev = dummy;
TreeNode cur = root, last = null;
while (cur != null || !stack.isEmpty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
// 将curappend到prev后面,并后移prev
prev.right = cur;
cur.left = prev;
// 存一下二叉树最大节点,以便退出循环之后将最小和最大节点连起来
last = cur;
prev = prev.right;
cur = cur.right;
}
last.right = dummy.right;
dummy.right.left = last;
return dummy.right;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。