千问 LeetCode 449. 序列化和反序列化二叉搜索树 Java实现

发布时间:2026/10/30 4:53:59
千问    LeetCode 449. 序列化和反序列化二叉搜索树 Java实现 这道题是经典的二叉树序列化问题利用 BST 的特性可以做到比通用二叉树更紧凑的编码。题目简述设计一个算法来序列化和反序列化二叉搜索树BST。序列化是将树转换为字符串反序列化是从字符串恢复原树。要求编码尽可能紧凑。核心思路序列化使用 前序遍历根-左-右将节点值用逗号分隔拼接成字符串。BST 的前序遍历有一个重要性质第一个值是根后面比根小的部分是左子树比根大的部分是右子树。反序列化将字符串按逗号分割成数组然后递归构建取第一个元素作为根节点。找到第一个大于根值的元素位置该位置之前是左子树的前序序列之后是右子树的前序序列。递归构建左右子树。Java 实现public class Codec {// 序列化前序遍历 public String serialize(TreeNode root) { if (root null) return ; StringBuilder sb new StringBuilder(); preorder(root, sb); return sb.toString(); } private void preorder(TreeNode node, StringBuilder sb) { if (node null) return; sb.append(node.val).append(,); preorder(node.left, sb); preorder(node.right, sb); } // 反序列化 public TreeNode deserialize(String data) { if (data null || data.isEmpty()) return null; String[] vals data.split(,); int[] index {0}; // 用数组包裹以便在递归中修改 return buildTree(vals, index, Integer.MIN_VALUE, Integer.MAX_VALUE); } private TreeNode buildTree(String[] vals, int[] index, int lower, int upper) { if (index[0] vals.length) return null; int val Integer.parseInt(vals[index[0]]); if (val lower || val upper) return null; index[0]; TreeNode node new TreeNode(val); node.left buildTree(vals, index, lower, val); // 左子树的值必须小于当前节点 node.right buildTree(vals, index, val, upper); // 右子树的值必须大于当前节点 return node; }}复杂度分析时间复杂度序列化 O(n)反序列化 O(n)每个节点只访问一次。空间复杂度O(n)递归栈深度最坏 O(n)退化为链表时平均 O(log n)。面试延伸为什么用前序遍历BST 的前序遍历 值域约束可以唯一确定一棵树无需像通用二叉树那样记录 null 节点。通用二叉树序列化通常用层序遍历或前序遍历 null 标记如 LeetCode 297。优化如果节点值范围已知可以用更紧凑的二进制编码而非字符串。需要我接着为你讲解 LeetCode 297. 二叉树的序列化与反序列化通用二叉树版本的对比实现吗

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询