码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树序列化

时间:2014-09-09 21:18:19      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   java   ar   数据   

 

普通二叉树的序列化和反序列化:

先序遍历,null节点用特殊符号标记。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;

public class Solution {

    public static void serialize(TreeNode root, PrintStream ps) {
        if (root == null)
            ps.print("# ");
        else {
            ps.print(root.val + " ");
            serialize(root.left, ps);
            serialize(root.right, ps);
        }
    }

    public static TreeNode deserialize(Scanner cin) {
        String token = cin.next();
        if (token.equals("#"))
            return null;
        int val = Integer.parseInt(token);
        TreeNode root = new TreeNode(val);
        root.left = deserialize(cin);
        root.right = deserialize(cin);

        return root;

    }

    public static void main(String[] args) throws FileNotFoundException {
        TreeNode root = new TreeNode(30);
        root.left = new TreeNode(20);
        root.left.left = new TreeNode(10);
        root.right = new TreeNode(40);
        root.right.left = new TreeNode(35);
        root.right.right = new TreeNode(50);
        PrintStream ps = new PrintStream(new File("serialize.txt"));
        serialize(root, ps);

        Scanner cin = new Scanner(new File("serialize.txt"));
        TreeNode back = deserialize(cin);
        
        System.out.println(back.val);

    }
}

 

 

BST的序列化和反序列化:

序列化:直接先序遍历输出

反序列化:根据先序遍历构造。O(n)时间。

import java.io.FileNotFoundException;
import java.util.Scanner;

public class Solution {

    private static int curVal;

    public static TreeNode deserializeBSTfromInorder(Scanner cin) {
        if (!cin.hasNext())
            return null;
        else {
            curVal = cin.nextInt();
            return deserialize(cin, Integer.MIN_VALUE, Integer.MAX_VALUE);
        }
    }

    private static TreeNode deserialize(Scanner cin, int min, int max) {
        if (curVal > min && curVal < max) {
            int val = curVal;
            TreeNode root = new TreeNode(val);
            if (cin.hasNext()) {
                curVal = cin.nextInt();
                root.left = deserialize(cin, min, val);
                root.right = deserialize(cin, val, max);
            }

            return root;
        } else
            return null;
    }

    public static void main(String[] args) throws FileNotFoundException {
        String s = "30 20 10 40 35 50";
        Scanner cin = new Scanner(s);
        TreeNode back = deserializeBSTfromInorder(cin);

        System.out.println(back.val);

    }

}

 

从数组度数据:

public class Solution {

    private int curr;

    public TreeNode deserialize(int[] preorder) {
        curr = 0;
        return deserialize(preorder, Integer.MIN_VALUE, Integer.MAX_VALUE);
    }

    public TreeNode deserialize(int[] preorder, int min, int max) {
        if (curr >= preorder.length || preorder[curr] <= min || preorder[curr] >= max) {
            return null;
        }

        int val = preorder[curr++];
        TreeNode root = new TreeNode(val);
        root.left = deserialize(preorder, min, val);
        root.right = deserialize(preorder, val, max);

        return root;

    }

    
    
    public static void main(String[] args) {
        int[] pre = new int[] { 30, 20, 10, 40, 35, 50 };
        TreeNode root = new Solution().deserialize(pre);
        
        System.out.println(root);
    }

}

 

参考:

http://leetcode.com/2010/09/saving-binary-search-tree-to-file.html

http://leetcode.com/2010/09/serializationdeserialization-of-binary.html

二叉树序列化

标签:des   style   blog   http   color   io   java   ar   数据   

原文地址:http://www.cnblogs.com/jdflyfly/p/3963240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!