买了个域名 如何自己做网站,上海工商核名查询系统官网,成都网站建设前几公司,用手机建立自己的网站二叉树被记录成文件的过程#xff0c;为二叉树的序列化
通过文件重新建立原来的二叉树的过程#xff0c;为二叉树的反序列化
设计方案并实现。
#xff08;已知结点类型为32位整型#xff09; 思路#xff1a;先序遍历实现。
因为要写入文件#xff0c;我们要把二叉树…二叉树被记录成文件的过程为二叉树的序列化
通过文件重新建立原来的二叉树的过程为二叉树的反序列化
设计方案并实现。
已知结点类型为32位整型 思路先序遍历实现。
因为要写入文件我们要把二叉树序列化为一个字符串。
首先我们要规定一个结点结束后的标志“”
然后就可以通过先序遍历生成先序序列了。 但是众所周知只靠先序序列是无法确定一个唯一的二叉树的原因分析如下
比如序列123
我们知道1是根但是对于2可以作为左孩子也可以作为右孩子 对于3我们仍然无法确定应该作为左孩子还是右孩子情况显得更加复杂 原因我们对于当前结点插入新结点是无法判断插入位置是应该作为左孩子还是作为右孩子。
因为我们的NULL并未表示出来。
如果我们把NULL也用一个符号表示出来
比如 12##3##
我们再按照先序遍历的顺序重建
对于1插入2时就确定要作为左孩子因为左孩子不为空。
然后接下来两个#我们就知道了2的左右孩子为空然后重建1的右子树即可。 我们定义结点 public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value data;}}
序列化 public static String serialByPre(Node head) {if (head null) {return #!;}String res head.value !;res serialByPre(head.left);res serialByPre(head.right);return res;} public static Node reconByPreString(String preStr) {//先把字符串转化为结点序列String[] values preStr.split(!);QueueString queue new LinkedListString();for (int i 0; i ! values.length; i) {queue.offer(values[i]);}return reconPreOrder(queue);}public static Node reconPreOrder(QueueString queue) {String value queue.poll();if (value.equals(#)) {return null;//遇空}Node head new Node(Integer.valueOf(value));head.left reconPreOrder(queue);head.right reconPreOrder(queue);return head;}
这样并未改变先序遍历的时空复杂度解决了先序序列确定唯一一颗树的问题实现了二叉树序列化和反序列化。