问题描述:
双向链表节点结构和二叉树节点结构是一样的,如果你把last认为是left,next认为是next的话。给定一个搜索二叉树的头节点head,请转化为一条有序的双向链表,并返回链表的头节点。
思路:
根据题意我们可以举例搜索二叉树转换为双向链表的例子。
转化为双向链表的顺序为:2 3 4 5 6 7 8.
我们可以发现转化后的结果和搜索二叉树的中序遍历节点顺序相同。
思路一:对搜索二叉树进行中序遍历,把遍历结果转化为双向链表的形式。
思路二:我们定义一个方法process(Node) ,这个方法返回以Node为根的搜索二叉树转化成的双向链表,返回这个双向链表的头节点和尾结点。在搜索二叉树根节点取到左子树的双向链表同时也取到右子树的双向链表,把这两个双向链表以及根节点结合成一个完整的双向链表。
代码
思路一代码
public static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
public static Node convert1(Node head) {
Queue<Node> queue = new LinkedList<>();
inOrderToQueue(head, queue);
if (queue.isEmpty()) {
return head;
}
head = queue.poll();
Node pre = head;
pre.left = null;
Node cur = null;
while (!queue.isEmpty()) {
cur = queue.poll();
pre.right = cur;
cur.left = pre;
pre = cur;
}
pre.right = null;
return head;
}
public static void inOrderToQueue(Node head, Queue<Node> queue) {
if (head == null) {
return;
}
inOrderToQueue(head.left, queue);
queue.offer(head);
inOrderToQueue(head.right, queue);
}
思路二代码
public static Node convert2(Node head) {
if (head == null) {
return null;
}
return process(head).start;
}
public static class Info {
public Node start;
public Node end;
public Info(Node start, Node end) {
this.start = start;
this.end = end;
}
}
public static Info process(Node X) {
if (X == null) {
return new Info(null, null);
}
Info leftInfo = process(X.left);
Info rightInfo = process(X.right);
if (leftInfo.end != null) {
leftInfo.end.right = X;
}
X.left = leftInfo.end;
X.right = rightInfo.start;
if (rightInfo.start != null) {
rightInfo.start.left = X;
}
return new Info(
leftInfo.start != null ? leftInfo.start : X,
rightInfo.end != null ? rightInfo.end : X
);
}