前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二叉树的序列化和反序列化

二叉树的序列化和反序列化

作者头像
名字是乱打的
发布于 2022-05-13 01:49:50
发布于 2022-05-13 01:49:50
20600
代码可运行
举报
文章被收录于专栏:软件工程软件工程
运行总次数:0
代码可运行
  • 二叉树被记录成文件的过程叫作二叉树的序列化
  • 通过文件内容重建原来的二叉树过程叫做二叉树反序列化

思路 : 序列化:先序遍历树,将树中字符转换进字符串,空值设置为null,隔断符号设置为! 反序列化:先将!做分隔符分隔字符串为数组,装进队列,递归遍历队列,设置结点和其左右结点.

代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.algorithm.practice.tree;

import com.algorithm.practice.tree.traversal.PreOrderPrint;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class SerializeAndReconstructTree {

    public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }
    //先序遍历序列化,将遍历结果转换为字符串
    public  static String SerializeTree(Node node){
        if (node==null){
            return "#!";
        }
        String res=node.value+"!";
        res+=SerializeTree(node.left);
        res+=SerializeTree(node.right);
        return res;
    }
    public static  Node ReconstructTree(String tS){
        String[] nodes = tS.split("!");
        if (nodes[0].equals("#")){
            return null;
        }
        Queue<String> queue=new LinkedList<>();
        for(int i=0;i<nodes.length;i++)
        {
            queue.offer(nodes[i]);
        }
        return reconPreOrder(queue);
    }

    private static Node reconPreOrder(Queue<String> queue) {
        String value=queue.poll();
        if (value.equals("#")){
            return null;
        }
        Node head=new Node(Integer.parseInt(value));
        head.left=reconPreOrder(queue);
        head.right=reconPreOrder(queue);
        return head;
    }
    public static void  preOrderPrint(Node head){
        System.out.print("pre-order: ");
        if (head!=null){
            Stack<Node> stack=new Stack<>();
            stack.push(head);
            while (!stack.isEmpty()){
                head = stack.pop();
                System.out.print(head.value);
                if (head.right!=null){
                    stack.push(head.right);
                }
                if (head.left!=null){
                    stack.push(head.left);
                }
            }
        }
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.left = new Node(2);
        head.right = new Node(3);
        head.left.left = new Node(4);
        head.right.right = new Node(5);
        String serializeTree = SerializeTree(head);
        Node node = ReconstructTree(serializeTree);
        preOrderPrint(node);

    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
思路: 二叉树的各种顺序中,随便挑1种,遍历每个节点, 拼装出1个字符串即可实现序列化。要注意的是, 空节点也需要, 可以找一个特殊符号比如#表示。 反序列化则是相反的过程,解析该字符串即可。
菩提树下的杨过
2021/11/04
2410
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
二叉树后序遍历-非递归版
后续遍历跟先序遍历比较像,这里是定义了两个栈,把打印的先放在打印栈stack2里 package com.algorithm.practice.tree.traversal; import java.util.Stack; public class PosOrderPrint { public static class Node { public int value; public Node left; public Node right;
名字是乱打的
2022/05/13
1940
序列化与反序列化二叉树_61
思路: 回溯 代码: String Serialize(TreeNode root) { if (root==null){ return "#!"; } //先序遍历 String res=root.val+"!"; res+=Serialize(root.left); res+=Serialize(root.right); return res; }
名字是乱打的
2021/12/23
2150
序列化与反序列化二叉树_61
二叉树中序遍历-非递归版
算法思想:每次把最左边的加到栈里,一直到没有左结点,从栈中取数据并打印,把右孩子当作头再遍历该子树
名字是乱打的
2022/05/13
2700
二叉树中序遍历-非递归版
判断树是不是平衡二叉树
关键思想: 递归遍历每个结点的左右树 若左树或者右树不是平衡二叉树则该结点树也不少平衡二叉树 若左树或者右树都是平衡二叉树则判断左右树高度之差,如果高度差大于1也是不平衡二叉树,否则该结点是平衡二叉树,高度是左右子树中较大值+1
名字是乱打的
2022/05/13
2510
【链表问题】打卡10:将搜索二叉树转换成双向链表
以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获。每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢。
帅地
2019/01/02
7290
二叉树的常用算法递归2 非递归3 小结4 实战coding5序列化和反序列化判断一棵二叉树是否是平衡二叉树判断一棵树是否是搜索二叉树、判断一棵树是否是完全二叉树
节点访问的次序,忽略打印行为 如果将打印安排在同个数字第一次被访问时,即先序遍历 第二次即中序遍历 第三次即后序遍历 现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式 二叉树结构定义 public static class Node { public int value; public Node left; public Node right; public Node(int data) { thi
JavaEdge
2018/05/16
1.3K0
判断一棵树是不是完全二叉树
若想判断该树是不是完全二叉树,需要看该树的结点是否满足完全二叉树规则造成的结点特性
名字是乱打的
2022/05/13
1730
【算法】搜索二叉树,完全二叉树,平衡二叉树的判断
它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
MapleYe
2020/03/28
1.1K0
LC297—二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
Java架构师必看
2021/04/22
3230
二叉树--前中后序遍历
package arithmetic; import java.util.Stack; /** * 二叉树的 前中后 序遍历 */ public class PrintNode { public static void main(String[] args) { Node n1 = new Node(1 + ""); Node n2 = new Node(2 + ""); Node n3 = new Node(3 + "");
solve
2019/10/30
3090
二叉树的基本概念和遍历
一、二叉树的基本概念 平衡二叉树:如果一棵树不为空,并且其中所有的子树都满足各自的左子树与右子树的高度差都不超过1。(空树是平衡二叉树)  1 //判断二叉树是否为平衡二叉树 2 import java.util.*; 3 4 /* 5 public class TreeNode { 6 int val = 0; 7 TreeNode left = null; 8 TreeNode right = null; 9 public TreeNode(int v
mukekeheart
2018/02/27
6870
二叉树的基本概念和遍历
判断一棵树是否是搜索二叉树
搜索二叉树它是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点值; 若其右子树存在,则其右子树中每个节点的值都不小于该节点值。 思想: 实际上只要树的中序遍历结果是升序的,那么其就是搜索二叉树 代码实现 package com.algorithm.practice.tree; import java.util.Stack; public class SearchTreeJudge { public static class
名字是乱打的
2022/05/13
1790
白话解释 DFS 与 BFS 算法 (二叉树的先序遍历,中序遍历、后序遍历、层次遍历)
本期的 DFS 与 BFS 搜索算法,我将围绕二叉树来讲解,所以在了解什么是 BFS 与 DFS 之前,我们先来回顾一下二叉树 的基本概念
Gorit
2021/12/08
6.5K0
白话解释 DFS 与 BFS 算法 (二叉树的先序遍历,中序遍历、后序遍历、层次遍历)
剑指61-序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
opencode
2022/12/26
1570
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。
圆号本昊
2021/09/24
3640
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
二叉树的遍历,递归版-先序中序后序
遍历命名 ------------百度百科 根据访问结点操作发生位置命名: ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历)) ——访问根结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(Inorder Traversal) ——访问根结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(Postorder Traversal) ——访问根结点的操作发生在遍历其左右子树之后。 这里以中序遍历讲一下该递归: 代码 package com
名字是乱打的
2022/05/13
3100
二叉树的遍历,递归版-先序中序后序
二叉树的非递归先序,中序,后序的打印
这里其实之前都写过了,这里复习了一遍,如果想看看大概思路的话可以看我的算法之树 递归三行代码就不讲了,这里讲一下如何利用栈来实现三种打印的非递归版.
名字是乱打的
2021/12/22
3450
二叉树的非递归先序,中序,后序的打印
LeetCode:二叉树的序列化与反序列化_297
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
Yuyy
2022/06/28
2570
LeetCode:二叉树的序列化与反序列化_297
[剑指offer] 序列化二叉树
原文地址: https://weiweiblog.cn/serialize/
尾尾部落
2018/09/04
6310
推荐阅读
相关推荐
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验