• 二叉树序列化


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

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

  • 相关阅读:
    无规矩不成方圆,聊一聊 Spring Boot 中 RESTful 接口设计规范
    一次SQL查询优化原理分析(900W+数据,从17s到300ms)
    重磅!GitHub官方开源新命令行工具
    JVM调优的反思与总结
    SpringMVC 进阶版
    《四大点,搞懂Redis到底快在哪里?》
    《Docker基础与实战,看这一篇就够了》
    带你从头到尾捋一遍MySQL索引结构
    MySQL信息提示不是英文问题
    完美解决windows+ngnix+phpcgi自动退出的问题
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3963240.html
Copyright © 2020-2023  润新知