首页 > 其他分享 >NC 序列化二叉树

NC 序列化二叉树

时间:2024-09-11 21:53:19浏览次数:10  
标签:序列化 TreeNode NC 二叉树 poll root 节点

系列文章目录


文章目录


前言

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
在这里插入图片描述


描述
请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。

二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树等遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#)

二叉树的反序列化(Deserialize)是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,可以根据层序遍历的方案序列化,如下图:
在这里插入图片描述
层序序列化(即用函数Serialize转化)如上的二叉树转为"{1,2,3,#,#,6,7}“,再能够调用反序列化(Deserialize)将”{1,2,3,#,#,6,7}"构造成如上的二叉树。

当然你也可以根据满二叉树结点位置的标号规律来序列化,还可以根据先序遍历和中序遍历的结果来序列化。不对序列化之后的字符串进行约束,所以欢迎各种奇思妙想。
在这里插入图片描述

public class Codec {
    int INF = 0x3f3f3f3f;
    TreeNode emptyNode = new TreeNode(INF);
    public String serialize(TreeNode root) {
        if (root == null) return "";

        StringBuilder sb = new StringBuilder();
        // 使用队列进行层序遍历,起始先将 root 放入队列
        Deque<TreeNode> d = new ArrayDeque<>();
        d.addLast(root);
        while (!d.isEmpty()) {
            // 每次从队列中取出元素进行「拼接」,包括「正常节点」和「叶子节点对应的首位空节点」
            TreeNode poll = d.pollFirst();
            sb.append(poll.val + "_");
            // 如果取出的节点不为「占位节点」,则继续往下拓展,同时防止「占位节点」不继续往下拓展
            if (!poll.equals(emptyNode)) {
                d.addLast(poll.left != null ? poll.left : emptyNode);
                d.addLast(poll.right != null ? poll.right : emptyNode);
            }
        }
        return sb.toString();
    }

    public TreeNode deserialize(String data) {
        if (data.equals("")) return null;

        // 根据分隔符进行分割
        String[] ss = data.split("_");
        int n = ss.length;
        // 怎么序列化就怎么反序列化
        // 使用队列进行层序遍历,起始先将 root 构建出来,并放入队列
        TreeNode root = new TreeNode(Integer.parseInt(ss[0]));
        Deque<TreeNode> d = new ArrayDeque<>();
        d.addLast(root);
        for (int i = 1; i < n - 1; i += 2) {
            TreeNode poll = d.pollFirst();
            // 每次从中取出左右节点对应 val
            int a = Integer.parseInt(ss[i]), b = Integer.parseInt(ss[i + 1]);
            // 如果左节点对应的值不是 INF,则构建「真实节点」
            if (a != INF) {
                poll.left = new TreeNode(a);
                d.addLast(poll.left);
            }
            // 如果右节点对应的值不是 INF,则构建「真实节点」
            if (b != INF) {
                poll.right = new TreeNode(b);
                d.addLast(poll.right);
            }
        }
        return root;
    }
}

标签:序列化,TreeNode,NC,二叉树,poll,root,节点
From: https://blog.csdn.net/pleaseprintf/article/details/142151292

相关文章

  • fastjson1.2.24反序列化漏洞复现 CVE-2017-18349
    1.准备:1.1复现环境漏洞环境:vulnhub靶场工具准备:jdk8,apache-maven-3.9.9,kali2024.1,MarshalSec1.2环境启动进入vulnhub目录下的fastjson目录,进入CVE-2017-18349目录cd/home/hbesljx/vulhub/fastjson/1.2.24-rcedocker-compoe启动漏洞环境docker-composeup-d访问靶机......
  • 微信小程序开发系列7----页面配置--WXML的include用法
       传递变量   模板不能引用 ......
  • # `delegate`、`Action`、`Func` 和 `Predicate`
    delegate、Action、Func和Predicate在C#中,delegate、Action、Func和Predicate都是用来处理方法引用或匿名方法的类型,但它们之间有一些关键的区别。Delegatedelegate是一个用户定义的类型,用于封装方法的引用。它可以被实例化为特定的方法引用,并且可以被用来调用该方法。......
  • 二叉树(上)
    目录树型结构概念二叉树概念二叉树的存储 二叉树基本操作基本变量二叉树的遍历完整代码树型结构概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 树......
  • 遗传与进化计算会议(Genetic and Evolutionary Computation Conference,简称GECCO)多目标
    遗传与进化计算会议(GeneticandEvolutionaryComputationConference,简称GECCO)是进化计算领域内最大的同行评审会议,也是计算机学会(ACM)遗传与进化计算特别兴趣小组(SIGEVO)的主要会议。它涵盖了遗传算法、遗传编程、蚁群优化和群体智能、复杂系统、进化组合优化和元启发式、进......
  • Windows电脑使用VNC远程连接本地局域网无公网IP树莓派5
    文章目录前言1.使用RaspberryPiImager安装RaspberryPiOS2.Windows安装VNC远程树莓派3.使用VNCViewer公网远程访问树莓派3.1安装Cpolar步骤3.2配置固定的公网地址3.3VNC远程连接测试4.固定远程连接公网地址4.1固定TCP地址测试前言树莓派因其小巧的......
  • YOLOv8改进系列,YOLOv8添加DiverseBranchBlock(多样分支块),并在C2f结构引入
    原论文摘要一种卷积神经网络(ConvNet)的通用构建模块,以在不增加推理时间成本的情况下提高性能。该模块被命名为多样分支块(DiverseBranchBlock,DBB),通过结合不同尺度和复杂度的多样分支来丰富特征空间,包括卷积序列、多尺度卷积和平均池化,从而增强单个卷积的表示能力。在训练......
  • 论文阅读翻译之Deep reinforcement learning from human preferences
    论文阅读翻译之Deepreinforcementlearningfromhumanpreferences关于首次发表日期:2024-09-11论文原文链接:https://arxiv.org/abs/1706.03741论文arxiv首次提交日期:12Jun2017使用KIMI,豆包和ChatGPT等机翻,然后人工润色如有错误,请不吝指出Deepreinforcementlearning......
  • solidworks卸载工具,专用卸载修复工具,一键卸载solidworks ae ai ansys arcgis catia c
    XXClean是一款专业的系统清理工具,旨在帮助用户彻底卸载和清理各种软件残留。它支持广泛的软件列表,aeaiansysArcGlSCatiaCDRCreoDaVinciMastercamMatlabMultisimofficeOriginProepsRhinoSketchupSPSSsolidworksTIAPortalUGNX软件等。以下是XXClean的简介......
  • 如何在Java服务中使用Circuit Breaker模式:Hystrix与Resilience4j的比较
    如何在Java服务中使用CircuitBreaker模式:Hystrix与Resilience4j的比较大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在分布式系统中,服务调用的稳定性和可靠性至关重要。CircuitBreaker(熔断器)模式可以有效地防止服务故障的蔓延,保护系统的稳定性。本......