[leetcode]449. Serialize and Deserialize BST设计BST的编解码
这道题学到了东西。
/*
一开始想着中序遍历,但是解码的时候才发现,中序遍历并不能唯一得确定二叉树。
后来看了网上的答案,发现先序遍历是可以的,观察了一下,对于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的编解码的更多相关文章
- [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 ...
- [leetcode]449. Serialize and Deserialize BST序列化反序列化二叉搜索树(尽量紧凑)
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- LeetCode 449. Serialize and Deserialize BST
原题链接在这里:https://leetcode.com/problems/serialize-and-deserialize-bst/description/ 题目: Serialization i ...
- 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)
[LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...
- 【leetcode】449. Serialize and Deserialize BST
题目如下: Serialization is the process of converting a data structure or object into a sequence of bits ...
- 449. Serialize and Deserialize BST
https://leetcode.com/problems/serialize-and-deserialize-bst/#/description Serialization is the proce ...
- 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 ...
- LeetCode 428. Serialize and Deserialize N-ary Tree
原题链接在这里:https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/ 题目: Serialization is the ...
- [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 ...
随机推荐
- ChromiumWebBrowser flash不能自动播放问题解决方案
前言:WPF项目 引用 CefSharp.Wpf 79.1.360,新版本的Cef默认flash不能自动播放 步骤一:提高pepflashplayer版本号 在CefSettings中设置版本号参数: ...
- MySQL 连接为什么挂死了
声明:本文为博主原创文章,由于已授权部分平台发表该文章(知乎.云社区),可能造成发布时间方面的困扰. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感到头疼,一来这类问题有 ...
- Kafak探究之路- 内部结构小结
1.框架与工作流 2 内部结构 kafka的每个主题分区的数据在 first-0(主题名-分区号)文件夹下,保存 n组xxx.log文件与xxx.index文件.log文件存发送消息的元数据,每个大小 ...
- 第1.2节 Python学习环境的使用
Python的环境安装好以后,可以通过IDLE(Python 3.7 64-bit)进入图形界面使用Python,也可以通过Python 3.7 64-bit进入命令行交互式界面,两者都可以使用,不过 ...
- PyQt(Python+Qt)学习随笔:QListWidget获取当前选中项的selectedItems方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidget的selectedItems方法返回列表部件中所有选中项的一个列表,调用语法如 ...
- [Java复习]架构部署 超时重试 幂等防重
画一下你们系统的整体架构图,说说各个服务在生产环境怎么部署的? 核心:服务框架.注册中心.网关 即使你没有用很多微服务架构里的东西,只要有上述三个东西,配合上写一些文档,接口文档,分布式系统架构,其实 ...
- selenium模拟淘宝登陆,过所有验证
淘宝模拟登陆实现 由于淘宝使用了滑动验证码,需要进行模糊手动滑动,因此考虑使用selenium+chromedriver进行模拟登陆. 淘宝的登陆网址:https://login.taobao.com ...
- 【题解】Casting Spells(UVA1470)
虽然训练指南上没有讲 Manacher--但是这题几乎就是一个裸的 Manacher啊-- 然而书上的标签是:有难度,配合数据结构 Manacher详解 题意 问给定字符串中最大的W串的长度.其中W串 ...
- qq 表情库
 ![/cy](https://cdn.luogu.com.cn/upload/pic/622 ...
- Linux 开机启动程序的顺序
1.加载BISO的硬件信息,并取得第一个开机代号 2.读取第一个开机装置的mbr的boot loader的信息 3.加载kernel操作系统核心信息,开始解压缩,并驱动所有硬件装置 4.kernel执 ...