剑指offer——序列化二叉树___
2017-06-24 19:35
381 查看
解题相关:二叉树序列化(持久化)
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。
序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
似乎下面的题目是以,为结点的结束。
请实现两个函数,分别用来序列化和反序列化二叉树
目前尚未通过:
错误:
过的代码:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/*
算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。
依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。
另外,结点之间的数值用逗号隔开。
*/
public class Solution {
int index = -1; //计数变量
String Serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if(root == null){
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
ad29
return sb.toString();
}
TreeNode Deserialize(String str) {
index++;
//int len = str.length();
//if(index >= len){
// return null;
// }
String[] strr = str.split(",");
TreeNode node = null;
if(!strr[index].equals("#")){
node = new TreeNode(Integer.valueOf(strr[index]));
node.left = Deserialize(str);
node.right = Deserialize(str);
}
return node;
}
}
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。
序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
似乎下面的题目是以,为结点的结束。
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树目前尚未通过:
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { StringBuffer stringBuffer = new StringBuffer(); String Serialize(TreeNode root) { if(root==null){ stringBuffer.append("#,"); return stringBuffer.toString(); } stringBuffer.append(root.val+","); preorder(root); return stringBuffer.toString(); } TreeNode Deserialize(String str) { if(str==null)return null; String array[] = str.split(","); int len = array.length; TreeNode root = new TreeNode(Integer.valueOf(array[0])); build(root,0,array,len); return root; } public void build(TreeNode root,int count,String[]array,int len){ if(count*2+1<len){ if(!array[count*2+1].equals("#")){ TreeNode left = new TreeNode(Integer.valueOf(array[count*2+1])); root.left = left; build(root.left, count*2+1, array, len); } }else { return; } if(count*2+2<len){ if(!array[count*2+2].equals("#")){ TreeNode right = new TreeNode(Integer.valueOf(array[count*2+2])); root.right = right; build(root.right, count*2+2, array, len); } }else { return; } } public void preorder(TreeNode root){ if(root.left!=null)stringBuffer.append(root.left.val+","); else if(root.right!=null) stringBuffer.append("#,"); if(root.right!=null)stringBuffer.append(root.right.val+","); else if(root.left!=null)stringBuffer.append("#,"); if(root.left!=null)preorder(root.left); if(root.right!=null)preorder(root.right); } }
错误:
过的代码:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
/*
算法思想:根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。
依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。
另外,结点之间的数值用逗号隔开。
*/
public class Solution {
int index = -1; //计数变量
String Serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
if(root == null){
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
ad29
return sb.toString();
}
TreeNode Deserialize(String str) {
index++;
//int len = str.length();
//if(index >= len){
// return null;
// }
String[] strr = str.split(",");
TreeNode node = null;
if(!strr[index].equals("#")){
node = new TreeNode(Integer.valueOf(strr[index]));
node.left = Deserialize(str);
node.right = Deserialize(str);
}
return node;
}
}
相关文章推荐
- 【剑指offer-解题系列(62)】序列化二叉树
- (C++)剑指offer-61:序列化二叉树(树)(再理解)
- 剑指Offer——序列化二叉树
- 剑指offer-二叉树的序列化和反序列化(困惑)-Java
- 剑指offer:序列化二叉树
- 剑指offer56--二叉树的序列化和反序列化
- 剑指offer--序列化二叉树
- 剑指offer 编程题(58):序列化二叉树
- 剑指Offer面试题62:序列化二叉树
- 剑指offer-序列化二叉树
- 剑指offer--面试题62:序列化二叉树
- 剑指offer 面试题62 序列化和反序列化二叉树
- 【剑指offer】第三十六题(二叉搜索树与双向链表) 和 第三十七题(序列化二叉树)
- 剑指offer_二叉树---序列化二叉树
- 剑指offer 序列化二叉树
- 【剑指Offer】序列化二叉树
- 剑指offer--序列化二叉树
- 剑指Offer-37:序列化二叉树
- 剑指offer 序列化二叉树
- 剑指offer——序列化,反序列化二叉树(好题)