zoukankan      html  css  js  c++  java
  • 二叉树序列化

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

    先序遍历,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

  • 相关阅读:
    在vim中设置将tab自动转化为4个空格
    nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache
    Centos7安装杀毒软件ClamAV
    网页中meta标记
    js刷新页面方法大全
    微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
    phpcms v9 如何实现用户登录
    web页面自适应手机屏幕宽度
    微信公共平台消息回复类
    自动回复微信消息
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3963240.html
Copyright © 2011-2022 走看看