449. 序列化和反序列化二叉搜索树

诸神缄默不语-个人CSDN博文目录
力扣刷题笔记

在这里插入图片描述

Python3版代码提示:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None# Your Codec object will be instantiated and called as such:
# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# tree = ser.serialize(root)
# ans = deser.deserialize(tree)
# return ans

Java版代码提示:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;

我真的忘的一干二净,就是有那么一点点熟悉,但是写起来又一脸懵逼。
直接抄题解。

文章目录

  • 1. 后序遍历
  • 2. 先序遍历

1. 后序遍历

seriallize就是常规的后序遍历(左→右→根)。
deserialize根据二叉搜索树的特性,递归反序列化根节点→右子树(直至接下来需要反序列化的节点值<根节点值)→左子树(直至接下来需要反序列化的节点值>根节点值)

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

Python3版:

class Codec:def serialize(self, root: TreeNode) -> str:arr = []def postOrder(root: TreeNode) -> None:if root is None:returnpostOrder(root.left)postOrder(root.right)arr.append(root.val)postOrder(root)return ' '.join(map(str, arr))def deserialize(self, data: str) -> TreeNode:arr = list(map(int, data.split()))def construct(lower: int, upper: int) -> TreeNode:if arr == [] or arr[-1] < lower or arr[-1] > upper:return Noneval = arr.pop()root = TreeNode(val)root.right = construct(val, upper)root.left = construct(lower, val)return rootreturn construct(-inf, inf)

Java版:

public class Codec {public String serialize(TreeNode root) {List<Integer> list = new ArrayList<Integer>();postOrder(root, list);String str = list.toString();return str.substring(1, str.length() - 1);}public TreeNode deserialize(String data) {if (data.isEmpty()) {return null;}String[] arr = data.split(", ");Deque<Integer> stack = new ArrayDeque<Integer>();int length = arr.length;for (int i = 0; i < length; i++) {stack.push(Integer.parseInt(arr[i]));}return construct(Integer.MIN_VALUE, Integer.MAX_VALUE, stack);}private void postOrder(TreeNode root, List<Integer> list) {if (root == null) {return;}postOrder(root.left, list);postOrder(root.right, list);list.add(root.val);}private TreeNode construct(int lower, int upper, Deque<Integer> stack) {if (stack.isEmpty() || stack.peek() < lower || stack.peek() > upper) {return null;}int val = stack.pop();TreeNode root = new TreeNode(val);root.right = construct(val, upper, stack);root.left = construct(lower, val, stack);return root;}
}

2. 先序遍历

class Codec:def serialize(self, root: Optional[TreeNode]) -> str:"""Encodes a tree to a single string."""def dfs(root: Optional[TreeNode]):if root is None:returnnums.append(root.val)dfs(root.left)dfs(root.right)nums = []dfs(root)return " ".join(map(str, nums))def deserialize(self, data: str) -> Optional[TreeNode]:"""Decodes your encoded data to tree."""def dfs(mi: int, mx: int) -> Optional[TreeNode]:nonlocal iif i == len(nums) or not mi <= nums[i] <= mx:return Nonex = nums[i]root = TreeNode(x)i += 1root.left = dfs(mi, x)root.right = dfs(x, mx)return rootnums = list(map(int, data.split()))i = 0return dfs(-inf, inf)

Java版:

public class Codec {private int i;private List<String> nums;private final int inf = 1 << 30;// Encodes a tree to a single string.public String serialize(TreeNode root) {nums = new ArrayList<>();dfs(root);return String.join(" ", nums);}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {if (data == null || "".equals(data)) {return null;}i = 0;nums = Arrays.asList(data.split(" "));return dfs(-inf, inf);}private void dfs(TreeNode root) {if (root == null) {return;}nums.add(String.valueOf(root.val));dfs(root.left);dfs(root.right);}private TreeNode dfs(int mi, int mx) {if (i == nums.size()) {return null;}int x = Integer.parseInt(nums.get(i));if (x < mi || x > mx) {return null;}TreeNode root = new TreeNode(x);++i;root.left = dfs(mi, x);root.right = dfs(x, mx);return root;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/97815.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop HDFS 高阶优化方案

目录 一、短路本地读取&#xff1a;Short Circuit Local Reads 1.1 背景 ​1.2 老版本的设计实现 ​1.3 安全性改进版设计实现 1.4 短路本地读取配置 1.4.1 libhadoop.so 1.4.2 hdfs-site.xml 1.4.3 查看 Datanode 日志 二、HDFS Block 负载平衡器&#xff1a;Balan…

pdf用什么软件打开?介绍几种常用打开方法

pdf用什么软件打开&#xff1f;PDF是一种广泛使用的文件格式&#xff0c;由于其跨平台和易于共享的特点&#xff0c;它已成为许多人在日常工作和学习中使用的首选文件格式。但是&#xff0c;有时候我们可能会遇到一些问题&#xff0c;比如不知道用什么软件打开PDF文件&#xff…

spring-secrity的Filter顺序+自定义过滤器

Filter顺序 Spring Security的官方文档向我们提供了filter的顺序&#xff0c;实际应用中无论用到了哪些&#xff0c;整体的顺序是保持不变的: ChannelProcessingFilter&#xff0c;重定向到其他协议的过滤器。也就是说如果你访问的channel错了&#xff0c;那首先就会在channel…

solidity开发环境配置,vscode搭配remix

#学习笔记 初学solidity&#xff0c;使用remix非常方便&#xff0c;因为需要的环境都配置好了&#xff0c;打开网站就可以使用。 不过在编写代码方面&#xff0c;使用vscode更方便&#xff0c;而vscode本身并不能像remix那样部署合约&#xff0c;它还需要安装插件。 点击红色箭…

centos7挂载nfs存储

centos7挂载nfs存储 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.安装NFS服务 #安装nfs yum -y install rpcbind nfs-utils#创建目录&#xff08;我这边是/data/upload&#xff09; mkdir -p /data/upload#写/etc/fstab文件&#xff0c;添加要挂载的nfs盘 172.16.…

如何自定义iview树形下拉内的内容

1.使用render函数给第一层父级定义 2. 使用树形结构中的render函数来定义子组件 renderContent(h, {root, node, data}) {return data.children.length0? h(span, {style: {display: inline-block,width: 400px,lineHeight: 32px}}, [h(span, [h(Icon, {type: ios-paper-outli…

LinkedHashMap实现LRU缓存cache机制,Kotlin

LinkedHashMap实现LRU缓存cache机制&#xff0c;Kotlin LinkedHashMap的accessOrdertrue后&#xff0c;访问LinkedHashMap里面存储的元素&#xff0c;LinkedHashMap就会把该元素移动到最尾部。利用这一点&#xff0c;可以设置一个缓存的上限值&#xff0c;当存入的缓存数理超过…

数据结构--6.2关键路径

AOE网&#xff1a; 在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边上的权值表示活动表示持续时间&#xff0c;这种有向图的边表示活动的网&#xff0c;我们称为AOE网&#xff08;Activity On Edge Network&#xff09;。 我们把AOE网中没有入边的…

GeoServe Web 管理界面 实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

【owt-server】AudioSendAdapter分析

owt-server/source/core/rtc_adapter/AudioSendAdapter.cc使用其他线程运行rtprtcpmodule taskrunner分配线程:因此,对rtprtcp的使用都是加了mutex的:首先为音频发送者生成一个随机的ssrc并注册 // SSRCs of this type.std::vector<uint32_t> ssrcs_;发送还要向rtprtc…

【实践篇】Redis使用规范清单详解

Redis 使用规范清单详解 文章目录 Redis 使用规范清单详解0. 前言参考资料 1. 键值对使用规范1. Key的命名规范2. 避免使用 bigkey2.1. "bigkey"的导致的问题2.2 避免"bigkey"问题解决方法2.2 1. 数据分片2.2.2. 数据压缩 3. 使用高效序列化方法和压缩方法…

合并到pdf怎么合并?这个方法了解一下

在现代数字化时代&#xff0c;PDF(便携式文档格式)已成为最常用的文件格式之一。PDF文件的优点在于其跨平台兼容性和保持文档格式不变的能力。然而&#xff0c;在某些情况下&#xff0c;我们可能需要知道合并到pdf。无论是为了方便管理、共享或者其他目的&#xff0c;本文将介绍…