专栏首页WeiMLing剑指Offer的学习笔记(C#篇)-- 序列化二叉树

剑指Offer的学习笔记(C#篇)-- 序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树

一 . 理解题意

二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的转换。将二叉树中的没个结点的空指针引出一个虚节点,其值为一个特定值,比如说 # 字符,我们成这种处理后的二叉树为原来二叉树的扩展二叉树。扩展二叉树和二叉树是一一对应关系。所以下图的前序的序列化序列为:A B # D # # C # #。

二 . 代码实现与分析

class Solution
    {
        public string Serialize(TreeNode root)
        {
            string result = "";
            //递归结束条件
            if (root == null)
            {
                result += "#,";
                //最终输出
                return result;
            }
            //序列化加数
            result += root.val + ",";
            //递归左子节点
            result += Serialize(root.left);
            //递归右子节点
            result += Serialize(root.right);
            //输出(非最终)
            return result;
        }
        //把它放在外面是有用意的,因为里面为了构造一个连加,这个是为了搞第一个数。
        private int index = -1;
        public TreeNode Deserialize(string str)
        {
            index += 1;
            TreeNode tmp= null;
            //去掉,
            string[] strList = str.Split(',');
            //子节点结束条件
            if (strList[index] != "#")
            {
                //把这个序列化里面的数一个个揪出来
                tmp = new TreeNode(int.Parse(strList[index]));
                //左子节点遍历
                tmp.left = Deserialize(str);
                //右子节点遍历
                tmp.right = Deserialize(str);
            }
            //反序列化输出
            return tmp;
        }
    }

又涉及到双递归了,双递归就要涉及到栈的知识,个人感觉很麻烦,不过递归记住两个点就好了。点1:递归停止条件。点二:递归内容。

其实最近的笔记一直是手写的,没有用画图工具精心去做,一来呢,手写更可以好好的思考,二就是比较快嘛,啊哈哈哈哈...........

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树。如下图:

    WeiMLing
  • 剑指Offer的学习笔记(C#篇)-- 翻转单词的序列

    该题目和上一个反转字符串的题目有些相似,但又不同。可以这样理解,翻转字符串是翻转的一句话里面所有字母的顺序;而翻转单词则是翻转单词的顺序。

    WeiMLing
  • 剑指Offer的学习笔记(C#篇)-- 构建乘积数组

    简而言之,给你一个数组,返回一个数组,返回的数组内容不包含A[i],注意题目中红色部分。也就是说,你返回的这个数组B,他的每一项都是数组A中除了...

    WeiMLing
  • H5小游戏的坑点小结

    1) iOS 9.1 的safari中,在onTouchBegan方法中调用cc.audioEngine.playEffect播放音效是没有效果的,如果在onT...

    meteoric
  • 如何判断Javascript对象是否存在

    Javascript语言的设计不够严谨,很多地方一不小心就会出错。 举例来说,请考虑以下情况。 现在,我们要判断一个全局对象myObj是否存在,如果不存在,就对...

    ruanyf
  • 理解js的变量提升

    当执行 JS 代码时,会生成执行环境,只要代码不是写在函数中的,就是在全局执行环境中,函数中的代码会产生函数执行环境,只此两种执行环境。 接下来让我们看一个老生...

    前端迷
  • 一键批量关闭 Linux 的 tty 的方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    耕耘实录
  • 前端读取Excel报表文件

    在实际开发中,经常会遇到导入Excel文件的需求,有的产品人想法更多,想要在前端直接判断文件内容格式是否正确,必填项是否已填写

    书童小二
  • 万字长文深度解析Python装饰器

    Python 中的装饰器是你进入 Python 大门的一道坎,不管你跨不跨过去它都在那里。

    马哥linux运维
  • 【flink training】 打车热点区域实时统计PopularPlaces

    http://training.data-artisans.com/是Apache Flink商业公司DataArtisans提供的一个flink学习平台,主要...

    sanmutongzi

扫码关注云+社区

领取腾讯云代金券