二叉树的序列化和反序列化
二叉树被记录成文件的过程叫做二叉树的序列号。通过文件内容重建原来二叉树的过程叫做二叉树的反序列号。
给定一个二叉树头节点head,并已知二叉树节点值的类型为32位整型。设计一种二叉树序列化,和反序列化方案,并且代码实现。
方法一,先序遍历下的序列化过程,首先假设徐立华的结果字符串为str,初始str=“”, 先序遍历二叉树,如果遇到null节点,就在str末尾加上“#” 节点不存在,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上 3!。
package TT; public class Test200 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public String serialByPre(Node head){ if(head==null){ return "#!"; } String res = head.value+"!"; res += serialByPre(head.left); res += serialByPre(head.right); return res; } }
接下来,通过先序遍历序列化的结果字符串str,重构二叉树的过程,反序列化。
方法二、通过层遍历实现序列化和反序列化
初始时 str=“空” 然后实现二叉树的按层遍历,具体方式是利用队列结构,也就是宽度遍历图的常见方式。
package TT; import java.util.LinkedList; import java.util.Queue; public class Test200 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public String serialBylevel(Node head){ if(head == null){ return "#!"; } String res = head.value+"!"; Queue<Node> queue = new LinkedList<Node>(); queue.offer(head); while(!queue.isEmpty()){ head=queue.poll(); if(head.left != null){ res+=head.left.value+"!"; queue.offer(head.left); }else { res+="#!"; } if(head.right != null){ res+=head.right.value+"!"; queue.offer(head.right); }else { res+="#!"; } } return res; } }
先序遍历的反序列化其实就是重做先序遍历,遇到“#”就生成null节点,结束生成后续子树的过程
package TT; import java.util.LinkedList; import java.util.Queue; public class Test200 { public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public String serialBylevel(Node head){ if(head == null){ return "#!"; } String res = head.value+"!"; Queue<Node> queue = new LinkedList<Node>(); queue.offer(head); while(!queue.isEmpty()){ head=queue.poll(); if(head.left != null){ res+=head.left.value+"!"; queue.offer(head.left); }else { res+="#!"; } if(head.right != null){ res+=head.right.value+"!"; queue.offer(head.right); }else { res+="#!"; } } return res; } public Node reconByLevelString(String levelStr){ String[] values = levelStr.split("!"); int index = 0; Node head = generateNodeByString(values[index++]); Queue<Node> queue = new LinkedList<Node>(); if(head != null){ queue.offer(head); } Node node = null; while(!queue.isEmpty()){ node = queue.poll(); node.left = generateNodeByString(values[index++]); node.right = generateNodeByString(values[index++]); if(node.left !=null){ queue.offer(node.left); } if(node.right != null){ queue.offer(node.right); } } return head; } public Node generateNodeByString(String val){ if(val.equals("#")){ return null; } return new Node(Integer.valueOf(val)); } }