程序员代码面试指南(左程云)读书笔记
第三章
二叉树的序列化和反序列化 题目:
二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原来的二叉树的过程叫做二叉树的反序列化。给定一棵二叉树的头节点head,并已知二叉树节点值得类型为32为整形。请设计一种二叉树序列化和反序列化的方案,并用代码实现。
方法一
通过先序遍历实现序列化和发序列化
首先假设序列化的结果字符串为str,初始时str="",先序遍历二叉树,如果遇到null节点,
就在str的末尾加上“#!”,“#”表示这个节点为空,节点值不存在,“!”表示一个值的结束
.
public class SerialBypre {public static void main(String[] args) {TreeNode no1=new TreeNode(2);TreeNode no2=new TreeNode(3);TreeNode no3=new TreeNode(4);no1.left=no2;no1.right=no3;System.out.println(serialBypre(no1));}public static String serialBypre(TreeNode head){if(head==null){return "#!";}String res=head.val+"!";res+=serialBypre(head.left);res+=serialBypre(head.right);return res;}}public class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode (int val) {this. val = val; }
}接下来是反序列化
把结果字符串str变成字符串类型的数组,记为values,数组代表一棵二叉树先序遍历的节点顺序。例如:
str="12!3!#!#!#!",生成的values为【‘12’,‘3’,‘#’,‘#’,‘#’】,然后用values[0..4]按照先序遍历的顺序建立整棵树。
1,遇到“12”,生成节点值12的节点(head) 然后用values[1..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节点,它是节点1的右孩子,该节点为null,所以这个节点没有后续建立子树过程。整个过程结束。
代码:
public TreeNode reconByPreString(String preStr){String values[] =preStr.split("!");Queue<String> queue=new LinkedList<String>();for(int i=0;i!=values.length;i++){queue.offer(values[i]);}return reconPreOrder(queue);}private TreeNode reconPreOrder(Queue<String> queue) {String value=queue.poll();if(value.equals("#")){return null;}TreeNode head=new TreeNode(Integer.valueOf(value));head.left=reconPreOrder(queue);head.right=reconPreOrder(queue);
return head;}
二叉树的序列化和反序列化
最新推荐文章于 2022-09-08 18:09:48 发布