序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。

编码的字符串应尽可能紧凑。

注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。

思路:

普通的二叉树需要两种遍历结果才能固定二叉树,而对于BST,得到BST的前序遍历,根据BST的性质,第一个元素值为根节点,小于根节点的元素为左子树,大于根节点的元素为右子树。

class Codec {
// Encodes a tree to a single string.
//BST的前序遍历结果
public String serialize(TreeNode root) {
if (root == null) return "";
StringBuilder sb = new StringBuilder();
helper(root, sb);
return sb.substring(0, sb.length() - 1);
} private void helper(TreeNode root, StringBuilder sb) {
if (root == null) return;
//拼接当前节点
sb.append(root.val).append(",");
helper(root.left, sb);
helper(root.right, sb);
} // Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data == null || data.length() == 0) return null;
String[] arr = data.split(",");
return builder(arr, 0, arr.length - 1);
} private TreeNode builder(String[] arr, int lo, int hi) {
if (lo > hi) return null;
TreeNode root = new TreeNode(Integer.valueOf(arr[lo]));
//找到第一个比首元素大的元素位置,这个位置把数组分割为左右子树
int index = hi + 1;
for (int i = lo + 1; i <= hi; i++) {
if (Integer.valueOf(arr[i]) > root.val) {
index = i;
break;
}
}
//递归构建子树
root.left = builder(arr, lo + 1, index - 1);
root.right = builder(arr, index, hi);
return root;
}
} 链接:https://leetcode-cn.com/problems/serialize-and-deserialize-bst/solution/java-shi-yong-qian-xu-bian-li-jin-xing-xu-lie-hua-/
来源:力扣(LeetCode)

最新文章

  1. Windows下安装Nginx+php+mysql环境
  2. Python中的file和open简述
  3. 关于Spring
  4. [转]ebkit内核浏览器的Linear Gradients (线性渐变)
  5. 越狱Season 1-Episode 14: The Rat
  6. C_functions
  7. 命令行运行android模拟器
  8. Install Linux Kernel - AT91SAM9260EK
  9. 解析http302重定向url
  10. ReentrantLock源码分析与理解
  11. 编译预处理命令define
  12. Android开发技巧——Camera拍照功能
  13. [PHP] ubuntu下使用uuid扩展获取uuid
  14. spring mvc 配置之 context:annotation-config vs component-scan
  15. C++ 线段树—模板&amp;总结
  16. java基础 (一)之HashMap
  17. MSP MCU I2C入门指南
  18. linux批量替换文本字符串
  19. CentOS 6 上安装 pip、setuptools
  20. 探索基于.NET下实现一句话木马之asmx篇

热门文章

  1. FCC-学习笔记 Sorted Union
  2. affine_trans_pixel 和 affine_trans_point_2d的区别
  3. flink KMeans算法实现
  4. Mybatis使用Mybatis-generator插件及配置(数据库逆向工程)
  5. MS17-010漏洞利用复现
  6. 1-9 Python判断结构
  7. 三种MPM在工作时的属性
  8. 201871010108-高文利《面向对象程序设计(java)》第十一周学习总结
  9. 论文阅读笔记六十五:Enhanced Deep Residual Networks for Single Image Super-Resolution(CVPR2017)
  10. mysql使用记录