0718学习 agile Posted on Jul 18 2023 面试 leetcode学习 - 剑指 Offer 37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。 --- ```C# // Encodes a tree to a single string. public string serialize(TreeNode root) { if (root == null) { return "[]"; } var sb = new StringBuilder(); sb.Append("["); var queue = new Queue<TreeNode>(); queue.Enqueue(root); while (queue.Count > 0) { var node = queue.Dequeue(); if (node != null) { sb.Append($"{node.val},"); queue.Enqueue(node.left); queue.Enqueue(node.right); } else { sb.Append("null,"); } } var index = sb.Length - 1; while (index > 5) { if (sb[index] == ',' && sb[index - 1] == 'l' && sb[index - 2] == 'l' && sb[index - 3] == 'u' && sb[index - 4] == 'n') { index -= 5; } else { break; } } sb.Remove(index, sb.Length - index); sb.Append("]"); return sb.ToString(); } // Decodes your encoded data to tree. public TreeNode deserialize(string data) { if (data.StartsWith("[") && data.EndsWith("]")) { data = data.Substring(1, data.Length - 2); var dataSplit = data.Split(','); if (dataSplit.Length == 0 || dataSplit[0] == "null" || dataSplit[0] == "") { return null; } var queue = new Queue<TreeNode>(); var root = new TreeNode(int.Parse(dataSplit[0])); queue.Enqueue(root); int i = 1; while (queue.Count > 0) { var node = queue.Dequeue(); if (i < dataSplit.Length && dataSplit[i] != "null") { node.left = new TreeNode(int.Parse(dataSplit[i])); queue.Enqueue(node.left); } i += 1; if (i < dataSplit.Length && dataSplit[i] != "null") { node.right = new TreeNode(int.Parse(dataSplit[i])); queue.Enqueue(node.right); } i += 1; } return root; } return null; } ``` 0719学习 0715学习