这道题学到了东西。

/*
一开始想着中序遍历,但是解码的时候才发现,中序遍历并不能唯一得确定二叉树。
后来看了网上的答案,发现先序遍历是可以的,观察了一下,对于BST,先序遍历确实是可以
唯一得确定。
对于一般的二叉树,必须是前序和中序或者后序和中序才能唯一确定,其中中序的作用就是
确定中心位置,以确定左右子树的前序(后序)的范围
但是对于BST根据性质,左子树的前序序列最大的就是1st节点,所以找到序列中第一个比
1st节点大的节点就是右子树的开始,这样就不需要中序了
还有一种方法,保存二叉树的结构信息,这种做法可以应用于任何二叉树。保存结构信息就是空节点添加一个符号代替,解码的时候就知道结构信息了
*/
//记录数据
StringBuilder s = new StringBuilder();
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
preTra(root);
return new String(s);
}
//前序遍历
public void preTra(TreeNode root)
{
if (root==null) return;
s.append(root.val);
s.append(",");
preTra(root.left);
preTra(root.right);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.length()==0) return null;
String[] vals = data.split(",");
return helper(vals,0,vals.length-1);
}
//解码过程,和由前序及中序得到二叉树的过程类似
public TreeNode helper(String[] data,int sta,int end)
{
if (sta > end) return null;
//根据BST的特点,获得左右子树前序遍历序列的起止点
int rightSta = rSta(data,sta,end);
TreeNode cur = new TreeNode(Integer.parseInt(data[sta]));
cur.left = helper(data,sta+1,rightSta-1);
cur.right = helper(data,rightSta,end);
return cur;
}
public int rSta(String[] data,int sta,int end)
{
/*
第一个比根节点大的值就是右子树的开始
*/
int a = Integer.parseInt(data[sta]);
while (sta<=end)
{
if (Integer.parseInt(data[sta])>a)
break;
sta++;
}
return sta;
}

对于普通二叉树,前序(后序)+中序可以唯一确定二叉树,前序(后序)包含父子关系信息,中序包含兄弟关系信息

下边是前序+中序确定二叉树

/*
* 如果知道(中序遍历和前序遍历)或者(中序遍历和后序遍历)可以唯一确定一棵树*/
/*
由前序遍历和中序遍历确定二叉树
*/
public TreeNode PaI(int[] pre,int[] in)
{
if (pre.length==0) return null;
//只剩下一个节点,就直接返回这个节点
if (pre.length==1)
return new TreeNode(pre[0]);
//根据前序遍历的开头获得中序遍历的中心
int center = pre[0];
int c = 0;
for (int i = 0; i < in.length; i++) {
if (in[i]==center)
{
c = i;
break;
}
}
//根据中序遍历和中心位置确定左右子树的前中序遍历序列,递归求子树
//左右子树的中序遍历就是中心位置的左右子序列
//左右子树的前序遍历序列是根节点后边序列分为的两部分,长度分别与其中序遍历序列长度一样
TreeNode cur = new TreeNode(center);
cur.left = PaI(Arrays.copyOfRange(pre,1, 1 + c),Arrays.copyOfRange(in,0,c));
cur.right = PaI(Arrays.copyOfRange(pre,c+1,pre.length),Arrays.copyOfRange(in,c+1,in.length));
return cur;
}

步骤记住两点:所有节点信息都是从前序序列中获得(每次都是根据前序的1st节点信息作为根节点),中序遍历只是用来确定左右子树的子前序的起止点。

然后递归获得左右子树

[leetcode]449. Serialize and Deserialize BST设计BST的编解码的更多相关文章

  1. [leetcode]449. Serialize and Deserialize BST序列化与反序列化BST

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  2. [leetcode]449. Serialize and Deserialize BST序列化反序列化二叉搜索树(尽量紧凑)

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  3. LeetCode 449. Serialize and Deserialize BST

    原题链接在这里:https://leetcode.com/problems/serialize-and-deserialize-bst/description/ 题目: Serialization i ...

  4. 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)

    [LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...

  5. 【leetcode】449. Serialize and Deserialize BST

    题目如下: Serialization is the process of converting a data structure or object into a sequence of bits ...

  6. 449. Serialize and Deserialize BST

    https://leetcode.com/problems/serialize-and-deserialize-bst/#/description Serialization is the proce ...

  7. 449. Serialize and Deserialize BST——几乎所有树的面试题目都会回到BFS或者DFS,使用BFS,None节点存#

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

  8. LeetCode 428. Serialize and Deserialize N-ary Tree

    原题链接在这里:https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/ 题目: Serialization is the ...

  9. [leetcode]297. Serialize and Deserialize Binary Tree 序列化与反序列化二叉树

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

随机推荐

  1. ChromiumWebBrowser flash不能自动播放问题解决方案

    前言:WPF项目 引用 CefSharp.Wpf 79.1.360,新版本的Cef默认flash不能自动播放 步骤一:提高pepflashplayer版本号 在CefSettings中设置版本号参数: ...

  2. MySQL 连接为什么挂死了

    声明:本文为博主原创文章,由于已授权部分平台发表该文章(知乎.云社区),可能造成发布时间方面的困扰. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感到头疼,一来这类问题有 ...

  3. Kafak探究之路- 内部结构小结

    1.框架与工作流 2 内部结构 kafka的每个主题分区的数据在 first-0(主题名-分区号)文件夹下,保存 n组xxx.log文件与xxx.index文件.log文件存发送消息的元数据,每个大小 ...

  4. 第1.2节 Python学习环境的使用

    Python的环境安装好以后,可以通过IDLE(Python 3.7 64-bit)进入图形界面使用Python,也可以通过Python 3.7 64-bit进入命令行交互式界面,两者都可以使用,不过 ...

  5. PyQt(Python+Qt)学习随笔:QListWidget获取当前选中项的selectedItems方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidget的selectedItems方法返回列表部件中所有选中项的一个列表,调用语法如 ...

  6. [Java复习]架构部署 超时重试 幂等防重

    画一下你们系统的整体架构图,说说各个服务在生产环境怎么部署的? 核心:服务框架.注册中心.网关 即使你没有用很多微服务架构里的东西,只要有上述三个东西,配合上写一些文档,接口文档,分布式系统架构,其实 ...

  7. selenium模拟淘宝登陆,过所有验证

    淘宝模拟登陆实现 由于淘宝使用了滑动验证码,需要进行模糊手动滑动,因此考虑使用selenium+chromedriver进行模拟登陆. 淘宝的登陆网址:https://login.taobao.com ...

  8. 【题解】Casting Spells(UVA1470)

    虽然训练指南上没有讲 Manacher--但是这题几乎就是一个裸的 Manacher啊-- 然而书上的标签是:有难度,配合数据结构 Manacher详解 题意 问给定字符串中最大的W串的长度.其中W串 ...

  9. qq 表情库

    ![/qq](https://cdn.luogu.com.cn/upload/pic/62224.png) ![/cy](https://cdn.luogu.com.cn/upload/pic/622 ...

  10. Linux 开机启动程序的顺序

    1.加载BISO的硬件信息,并取得第一个开机代号 2.读取第一个开机装置的mbr的boot loader的信息 3.加载kernel操作系统核心信息,开始解压缩,并驱动所有硬件装置 4.kernel执 ...