BST换排好序的任何数据结构用脚趾头想都应该是inorder的dfs。这里也就是dfs中间穿插一些前后连接的操作就行了。
给出两种解法,一个是递归做的,一个是用Stack做的。(意想不到的是递归的比Stack的要快)
public Node treeToDoublyList(Node root) {
if (root == null) return null;
Node[] prev = new Node[1];
Node[] newRoot = new Node[1];
dfs(root, prev, newRoot);
newRoot[0].left = prev[0];
prev[0].right = newRoot[0];
return newRoot[0];
}
public void dfs(Node current, Node[] prev, Node[] newRoot) {
if (current != null) {
dfs(current.left, prev, newRoot);
if (newRoot[0] == null) {
newRoot[0] = current;
}
if (prev[0] != null) {
prev[0].right = current;
current.left = prev[0];
}
prev[0] = current;
dfs(current.right, prev, newRoot);
}
}
public Node treeToDoublyList(Node root) {
if (root == null) return null;
Node current = root;
Node prev = null, firstNode = null;
Stack<Node> nodeStk = new Stack<>();
while(current != null || !nodeStk.isEmpty()) {
if (current != null) {
nodeStk.push(current);
current = current.left;
} else {
current = nodeStk.pop();
if (firstNode == null) {
firstNode = current;
}
if (prev != null) {
prev.right = current;
current.left = prev;
}
prev = current;
current = current.right;
}
}
prev.right = firstNode;
firstNode.left = prev;
return firstNode;
}