您的位置:首页 > Web前端

剑指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;

}

}
*/
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;
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: