/**
*
* 【问题】
* 二叉树的反序列化
* 通过文件内容重建原来的二叉树
* 【解析】
* 把结果字符串str变成字符串类型的数组,记为values, 数组代表一棵二叉树先序遍历
* 的节点顺序。例如, str= "l2!3!#!#!#!中,生成的values为["12","3","#","#","#"], 然后用
* values[0 .. 4]按照先序遍历的顺序建立整棵树。
* 1.遇到"12", 生成节点值为12的节点(head), 然后用values[l . .4]建立节点12的左子树。
* 2.遇到"3", 生成节点值为3的节点,它是节点12的左孩子,然后用values[2. .4]建立
* 节点3的左子树。
* 3.遇到"#", 生成null节点, 它是节点3的左孩子,该节点为null, 所以这个节点没有后续建
* 立子树的过程。回到节点3后, 用values[3. .4]建立节点3的右子树。
* 4.遇到'#", 生成null节点, 它是节点3的右孩子,该节点为null, 所以这个节点没有后续建立
* 子树的过程。回到节点3后, 再回到节点1, 用values[4]建立节点1的右子树。
* 5.遇到"#",生成null节点, 它是节点l的右孩子, 该节点为null, 所以这个节点没有后续建
* 立子树的过程。整个过程结束。
*
* @author 雪瞳
* @Slogan 时钟尚且前行,人怎能再此止步!
* @Function 实现树的反序列化
*
*/
public class ReSerival {
/**
* 讲树放入队列内
* @param string 输入字符串
* @return 字符串转化成的队列
*/
public static Node getTrueNode(String string){
String regularExpression = "!";
String[] values = string.split(regularExpression);
Queue<String> queue = new LinkedList<>();
for (int i=0;i != values.length;i++){
queue.offer(values[i]);
}
return recover(queue);
}
public static Node recover(Queue<String> queue){
Node head = null;
String flag = "#";
String value = queue.poll();
if (flag.equals(value)){
return head;
}
head = new Node(Integer.valueOf(value));
head.left = recover(queue);
head.right = recover(queue);
return head;
}
public static void showTree(Node head){
if (head == null){
return;
}
System.out.println(head.value);
showTree(head.left);
showTree(head.right);
}
public static void main(String[] args) {
String string = "12!3!#!4!#!#!#!";
Node result = getTrueNode(string);
showTree(result);
}
}
class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value=data;
}
}