1. 题目
2. 思路
(1) 中序遍历
- 首先中序遍历二叉树,将结点按照中序遍历的顺序存入ArrayList中,然后按照ArrayList中结点的顺序依次修改结点的左右指针即可。
(2) 中序遍历优化
- 在中序遍历时利用全局变量保存前一结点的引用,修改前一结点与当前结点之间的指针,然后保存当前结点的引用作为前一结点。
3. 代码
import sun.plugin.cache.CacheUpdateHelper;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
}
}
class Node {
public int val;
public Node left;
public Node right;
public Node() {
}
public Node(int _val) {
val = _val;
}
public Node(int _val, Node _left, Node _right) {
val = _val;
left = _left;
right = _right;
}
};
class Solution {
List<Node> list = new ArrayList<>();
public Node treeToDoublyList(Node root) {
if (root == null) {
return null;
}
inorder(root);
if (list.size() == 1) {
list.get(0).left = list.get(0);
list.get(0).right = list.get(0);
return list.get(0);
}
for (int i = 1; i < list.size() - 1; i++) {
list.get(i).left = list.get(i - 1);
list.get(i).right = list.get(i + 1);
}
list.get(0).left = list.get(list.size() - 1);
list.get(0).right = list.get(1);
list.get(list.size() - 1).left = list.get(list.size() - 2);
list.get(list.size() - 1).right = list.get(0);
return list.get(0);
}
private void inorder(Node root) {
if (root == null) {
return;
}
inorder(root.left);
list.add(root);
inorder(root.right);
}
}
class Solution1 {
private Node pre;
private Node head;
public Node treeToDoublyList(Node root) {
if (root == null) {
return null;
}
inorder(root);
head.left = pre;
pre.right = head;
return head;
}
private void inorder(Node root) {
if (root == null) {
return;
}
inorder(root.left);
if (pre == null) {
head = root;
} else {
pre.right = root;
}
root.left = pre;
pre = root;
inorder(root.right);
}
}