分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/
package live.every.day.ProgrammingDesign.CodingInterviewGuide.List;
import java.util.LinkedList;
import java.util.Queue;
/**
* 将搜索二叉树转换成双向链表
*
* 【题目】
* 对于二叉树的节点来说,有本身的数据域,有指向左孩子和右孩子的两个指针;对双向链表的节点来说,有本身的数据域,有指向上一
* 个节点和下一个节点的指针。在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。
* 对每一个节点来说,原来的二叉树右孩子指针等价于转换后的双向链表的next指针,原来的二叉树左孩子指针等价于转换后的pre指
* 针,最后返回转换后的双向链表头节点。
*
* 【难度】
* 中等
*
* 【解答】
* 方法一:用队列等容器收集二叉树中序遍历结果的方法。时间复杂度为O(N),额外空间复杂度为O(N),具体过程如下:
* 1、生成一个队列,记为queue,按照二叉树中序遍历的顺序,将每个节点放入queue中。
* 2、从queue中依次弹出节点,并按照弹出的顺序重连所有的节点即可。
* 方法一的具体实现请参看如下代码中的convert1方法。
*
* @author Created by LiveEveryDay
*/
public class ConvertBSTToDoubleList1 {
public static class Node {
public int data;
public Node left;
public Node right;
public Node(int data) {
this.data = 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;
}
private 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 void main(String[] args) {
Node node1 = new Node(2);
Node node2 = new Node(3);
Node node3 = new Node(5);
Node node4 = new Node(7);
Node node5 = new Node(8);
Node node6 = new Node(1);
Node node7 = new Node(3);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node5;
node3.left = node6;
node3.right = node7;
Node n = convert1(node1);
while (n != null) {
System.out.printf("%d ", n.data);
n = n.right;
}
}
}
// ------ Output ------
/*
7 3 8 2 1 5 3
*/