剑指offer37 序列化二叉树

使用'$'代替null序列化从而只使用前序遍历序列即可得到确定的二叉树的思想很重要,实现起来略麻烦,大概写了下,没跑通,但思路是对的。

记录一下,知道这个思路就好,这个题代码长度过长,应该不会考。

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    String Serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        SerializeRecursively(root,sb);
        sb.delete(sb.length()-1,sb.length());
        return sb.toString();
    }
    private void SerializeRecursively(TreeNode root,StringBuilder sb){
        if(root==null) sb.append("$,");
        else{
            sb.append(root.val+",");
            SerializeRecursively(root.left,sb);
            SerializeRecursively(root.right,sb);
        }
    }
    TreeNode Deserialize(String str) {
        if(str==null) return null;
        
        int[] strIndex = new int[]{0};
        return DeserializeRecursively(str,strIndex);
    }
    private TreeNode DeserializeRecursively(String str,int[] strIndex){
        if(strIndex[0]>=str.length()||str.charAt(strIndex[0])=='$') return null;
        TreeNode p = new TreeNode(getValFromString(str,strIndex));
        p.left = DeserializeRecursively(str,strIndex);
        p.right = DeserializeRecursively(str,strIndex);
        return p;
    }
    private int getValFromString(String str,int[] strIndex){
        int start = strIndex[0];
        int end = strIndex[0];
        for(;end<str.length();end++) if(str.charAt(end)==',') break;
        int val = 0;int flag = 1;
        for(int i=start;i<end;i++){
            if(i==start&&str.charAt(i)=='-'){flag=-1;continue;}
            val = val*10+str.charAt(i)-'0';
        }
        strIndex[0]++;
        return flag*val;
    }
}

 

posted @ 2019-02-27 13:15  大胖子球花  阅读(109)  评论(0)    收藏  举报