zoukankan      html  css  js  c++  java
  • 二叉树——二叉树的序列化和反序列化

    二叉树的序列化和反序列化
    前序遍历的序列化与反序列化

    /**
     * Created by Skye on 2018/4/25.
     * 二叉树的序列化和反序列化
     *             0
     *         1        2
     *      3    4    5   6
     *    7    / 8  / 9 / 
     */
    public class SerializeAndReconstructTree {
    
        //前序遍历的序列化
        public static String serialBinaryTree(Tree tree){
            if(tree == null) return "#_";
    
            String res = tree.val + "_";
            res += serialBinaryTree( tree.left );
            res += serialBinaryTree( tree.right );
            return res;
        }
    
        public static Tree reconstructTree(String str){
            //以分隔符_为标志,将字符串分割为一个一个的结点,组成一个数组
            String []values = str.split("_");
    
            //队列:用来盛放数组中的字符,这样可以在后面每次出队列一个字符,就省去了使用数组的话,还要有一个额外的指针来指向当前结点
            Queue<String> queue = new LinkedList<>();
            for(int i = 0; i < values.length; i++){
                queue.offer(values[i]);
            }
            return reconstruct(queue);
        }
    
        public static Tree reconstruct(Queue<String> queue){
            String value = queue.poll();
            if("#".equals(value)){
                return null;
            }
            Tree node = new Tree(Integer.valueOf(value));
            node.left = reconstruct( queue );
            node.right = reconstruct(queue);
            return node;
        }
    
        public static void inOrder(Tree tree){
            if(tree == null) return;
            
            Stack<Tree> stack = new Stack<>();
            stack.push(tree);
            while(!stack.empty()){
                tree = stack.pop();
                System.out.print(tree.val + " ");
                if(tree.right != null){
                    stack.push(tree.right);
                }
                if(tree.left != null){
                    stack.push(tree.left);
                }
            }
        }
    
        public static void main(String[] args){
            Tree tree = new Tree( 0 );
            tree.left = new Tree(1);
            tree.right = new Tree(2);
            tree.left.left = new Tree( 3 );
            tree.left.right = new Tree( 4 );
            tree.left.left.left = new Tree( 7 );
            tree.left.right.right = new Tree(8);
            tree.right.left = new Tree( 5 );
            tree.right.right = new Tree( 6 );
            tree.right.left.right = new Tree( 9 );
    
            //前序遍历 0 1 3 7 4 8 2 5 9 6
            //中序遍历 7 3 1 4 8 0 5 9 2 6
            //后序遍历 7 3 8 4 1 9 5 6 2 0
            //层序遍历 0 1 2 3 4 5 6 7 8 9
            String serialize = serialBinaryTree( tree );
            System.out.println(serialize);
            Tree root = reconstructTree( serialize );
            inOrder( root );
        }
    
    }
    

      

  • 相关阅读:
    java Math类方法使用
    线性逻辑回归与非线性逻辑回归pytorch+sklearn
    Java学习方向
    ubuntu16.04安装Anaconda+Pycharm+Pytorch
    迁移学习resnet
    简单的CNN图像分类datasets.MNIST/FashionMNIST
    pytorch学习2
    tools/build.c
    zBoot/Makefile
    tools/version.c
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8947099.html
Copyright © 2011-2022 走看看