• Leetcode刷题449. 序列化和反序列化二叉搜索树


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

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

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

    示例 1:

    输入:root = [2,1,3]
    输出:[2,1,3]
    示例 2:

    输入:root = []
    输出:[]

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/serialize-and-deserialize-bst
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    方法一:递归,时间和空间复杂度O(N)

    1. public class Codec {
    2. // Encodes a tree to a single string.
    3. public String serialize(TreeNode root) {
    4. StringBuilder sb = new StringBuilder();
    5. traverse(root, sb);
    6. return sb.toString();
    7. }
    8. final String SEP = ",";
    9. private void traverse(TreeNode root, StringBuilder sb) {
    10. if (root == null) {
    11. return;
    12. }
    13. sb.append(root.val).append(SEP);
    14. traverse(root.left, sb);
    15. traverse(root.right, sb);
    16. }
    17. // Decodes your encoded data to tree.
    18. public TreeNode deserialize(String data) {
    19. if (data == null || data.isEmpty()) {
    20. return null;
    21. }
    22. List list = new ArrayList<>();
    23. for (String node : data.split(SEP)) {
    24. list.add(Integer.parseInt(node));
    25. }
    26. return deserialize(list, 0, list.size() - 1);
    27. }
    28. private TreeNode deserialize(List list, int lo, int hi) {
    29. if (lo > hi) {
    30. return null;
    31. }
    32. TreeNode root = new TreeNode(list.get(lo));
    33. int k = lo + 1;
    34. //利用BST特性,左子树小于根节点值,找到分界点
    35. while (k <= hi && list.get(k) < list.get(lo)) {
    36. k++;
    37. }
    38. root.left = deserialize(list, lo + 1, k - 1);
    39. root.right = deserialize(list, k, hi);
    40. return root;
    41. }
    42. }

    方法二:利用栈遍历,时间和空间复杂度O(N)

    1. public class Codec {
    2. // Encodes a tree to a single string.
    3. public String serialize(TreeNode root) {
    4. StringBuilder sb = new StringBuilder();
    5. traverse(root, sb);
    6. return sb.toString();
    7. }
    8. final String SEP = ",";
    9. private void traverse(TreeNode root, StringBuilder sb) {
    10. if (root == null) {
    11. return;
    12. }
    13. sb.append(root.val).append(SEP);
    14. traverse(root.left, sb);
    15. traverse(root.right, sb);
    16. }
    17. // Decodes your encoded data to tree.
    18. public TreeNode deserialize(String data) {
    19. if (data == null || data.isEmpty()) {
    20. return null;
    21. }
    22. String[] preOrder = data.split(SEP);
    23. TreeNode root = new TreeNode(Integer.parseInt(preOrder[0]));
    24. Stack stack = new Stack<>();
    25. stack.push(root);
    26. for (int i = 1; i < preOrder.length; i++) {
    27. int val = Integer.parseInt(preOrder[i]);
    28. TreeNode node = new TreeNode(val);
    29. //小于栈顶元素的值,说明应该在栈顶元素的左子树
    30. if (stack.peek().val > val) {
    31. stack.peek().left = node;
    32. } else {
    33. //大于栈顶元素的值,我们要找到当前元素的父节点
    34. TreeNode parent = stack.peek();
    35. //栈从栈底到栈顶是递减的
    36. while (!stack.isEmpty() && stack.peek().val < val) {
    37. parent = stack.pop();
    38. }
    39. parent.right = node;
    40. }
    41. stack.push(node);
    42. }
    43. return root;
    44. }
    45. }

  • 相关阅读:
    Kubernetes 1.25 正式发布,多方面重大突破
    YAGEO(国巨)旧电脑风扇制作风力发电机步骤详解 - 电动机控制电路图
    Vue中computed -计算属性详解
    stream 里面的 Collectors.toMap 用法 ; list转map
    速腾聚创80线激光雷达 ros1 驱动安装和线数屏蔽(亲测可用)
    显而易看app的订阅内容
    【前端】图片裁剪路径绘制及图片不规则裁剪
    dlv调试kubelet
    深度学习(PyTorch)——循环神经网络(RNN)基础篇四
    间歇采样转发干扰
  • 原文地址:https://blog.csdn.net/Bonbon_wen/article/details/127827733