二叉搜索树与双向链表
- dfs+LinkedList
LinkedList<Node> list = new LinkedList<>();
public Node treeToDoublyList(Node root) {
if (root == null) return null;
if (root.left == null && root.right == null) {
root.right = root;
root.left = root;
return root;
}
dfs(root);
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
list.get(i).left = list.get(list.size() - 1);
list.get(i).right = list.get(i + 1);
}
else if (i == list.size() - 1) {
list.get(i).left = list.get(i - 1);
list.get(i).right = list.get(0);
}
else {
list.get(i).right = list.get(i + 1);
list.get(i).left = list.get(i - 1);
}
}
return list.get(0);
}
public void dfs(Node root) {
if (root != null) {
dfs(root.left);
list.add(root);
dfs(root.right);
}
}
- 引入Node pre, head节点+中序遍历。
当pre == null,head = cur;
当pre != null, pre.right = cur, cur.left = pre;
中序遍历后的pre指向尾节点,head为头节点,pre.right = head, head.left = pre;
Node pre = null, head = null;
public Node treeToDoublyList(Node root) {
if (root == null) return null;
dfs(root);
pre.right = head;
head.left = pre;
return head;
}
public void dfs(Node root) {
if (root != null) {
dfs(root.left);
Node cur = root;
if (pre == null) {
head = cur;
}
else {
pre.right = cur;
cur.left = pre;
}
pre = cur;
dfs(root.right);
}
}