Algorithm

本周的 LeetCode 题目为 297. 二叉树的序列化与反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

  1. 1
  2. / \
  3. 2 3
  4. / \
  5. 4 5
  6. 输入:root = [1,2,3,null,null,4,5]
  7. 输出:[1,2,3,null,null,4,5]

二叉树的序列化后的结果采用先序遍历的方式。

  • 在进行序列化时,先判断当前节点是否为空,若为空则记录 null,若不为空,则先将根的值和分隔符(',')添加,再依次递归处理当前节点的左子树、右子树。
  • 在进行反序列化时,先判断当前是否为 null,若为 null 则返回 null,若不为 null,则先以当前值构造出根节点,移除第一个元素,再依次构建该节点的左子树、右子树。
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Codec {
  11. // Encodes a tree to a single string.
  12. public String serialize(TreeNode root) {
  13. StringBuilder sb = new StringBuilder();
  14. realSerialize(root, sb);
  15. return sb.toString();
  16. }
  17. public void realSerialize(TreeNode root, StringBuilder sb) {
  18. if (root != null) {
  19. sb.append(root.val);
  20. sb.append(",");
  21. realSerialize(root.left, sb);
  22. realSerialize(root.right, sb);
  23. } else {
  24. sb.append("null,");
  25. }
  26. }
  27. // Decodes your encoded data to tree.
  28. public TreeNode deserialize(String data) {
  29. String[] dataArr = data.split(",");
  30. List<String> dataList = new ArrayList<>(Arrays.asList(dataArr));
  31. // dataList = Arrays.asList(dataArr);
  32. TreeNode ans = realDeserialize(dataList);
  33. return ans;
  34. }
  35. public TreeNode realDeserialize(List<String> dataList) {
  36. if (dataList.get(0).equals("null")) {
  37. dataList.remove(0);
  38. return null;
  39. }
  40. TreeNode root = new TreeNode(Integer.valueOf(dataList.get(0)));
  41. dataList.remove(0);
  42. root.left = realDeserialize(dataList);
  43. root.right = realDeserialize(dataList);
  44. return root;
  45. }
  46. }
  47. // Your Codec object will be instantiated and called as such:
  48. // Codec ser = new Codec();
  49. // Codec deser = new Codec();
  50. // TreeNode ans = deser.deserialize(ser.serialize(root));

Review

本周 Review 的英文文章为:如何在 git 中使用 squashrebase

作者详细介绍了使用 squashrebase 的流程,首先你需要备份一个分支用来尝试:

  1. git checkout my-branch-name
  2. git branch backup-my-branch-name
  3. git push origin backup-my-branch-name

而后查看日志找到不属于你的最新提交的 id,别忘了复制它

  1. git log

而后开始 rebase 操作,将 -i 后面的内容替换为你刚刚找到的提交 id

  1. git rebase -i the-commit-id-you-looked-up-goes-here

通过在除第一个提交之外的所有提交前面放置“s”而不是“pick”来标记要压缩(squash)的提交。而后保存并关闭,等待弹出新的文本编辑器提示来输入你的 commit 信息。

使用 git status 来检查是否有任何问题。

接下来作者将所有提交都合并到 main 分支中,先确保本地的 main 分支是最新的

  1. git checkout main
  2. git pull origin main

接下来进行 rebase 操作,先切换分支再 rebase

  1. git checkout my-branch-name
  2. git rebase main

修复发生的 git 冲突后,暂存如下的文件:

  1. git add some-file.js

而后再继续完成 rebase

  1. git rebase --continue

最后提交 commit,请先检查分支是你的分支!

  1. git push --force-with-lease origin my-branch-name

如果途中出现了问题,你还有一个备份分支可以用来恢复,或者使用 git rebase --abort 来中止正在进行的 rebase

为什么要在 rebase 前进行 squash?在使用 squash 压缩提交后,rebase 需要解决的冲突至多需要一次,而当你的公司/组织/项目要求你不得压缩时,那么就不要使用 squash

Tip

使用宏定义的注意事项,宏定义是直接替换,并不是保存计算的结果。示例代码如下:

  1. #include <stdio.h>
  2. #define NUM_0 4
  3. #define NUM_1 5-1
  4. #define NUM_2 (5-1)
  5. int main()
  6. {
  7. printf("%d\n", 5 % NUM_0); // 5 % NUM_1 = 5 % 4 = 1
  8. printf("%d\n", 5 % NUM_1); // 5 % NUM_1 = 5 % 5-1 = 0 - 1 = -1
  9. printf("%d\n", 5 % NUM_2); // 5 % NUM_1 = 5 % (5-1) = 5 % 4 = 1
  10. return 0;
  11. }

程序的运行结果如下:

  1. $ clang test.c
  2. $ ./a.out
  3. 1
  4. -1
  5. 1

Share

未来几周内打算抽空认真地、系统性地回顾下基本的数据结构、算法,为下一步做 LeetCode 题目做准备。

ARTS Week 22的更多相关文章

  1. 【ARTS】01_44_左耳听风-201900909~201900915

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  2. ARTS Week 8

    Dec 16, 2019 ~ Dec 22, 2019 Algorithm Problem 53 Maximum Subarray 最大子数组 题目链接 题目描述:给定一个数组,在所有连续的子数组中, ...

  3. 造!又有新的生产力语言了「GitHub 热点速览 v.22.30」

    作者:HelloGitHub-小鱼干 你还记得那些 PHP 开发都去哪了吗?转 Golang 了!移动端现在流行什么?Flutter 编程.现在谷歌带着新的生产力语言来了,Carbon,代号:C++ ...

  4. CENTOS 6.5 平台离线编译安装 Mysql5.6.22

    一.下载源码包 http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.22.tar.gz 二.准备工作 卸载之前本机自带的MYSQL 安装 cmake,编 ...

  5. EC笔记:第4部分:22、所有成员都应该是private的

    EC笔记:第4部分:22.所有成员都应该是private的 更简单的访问 用户不用记得什么时候该带上括号,什么时候不用带上括号(因为很确定的就要带上括号) 访问限制 对于public的成员变量,我们可 ...

  6. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  7. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  8. Fedora 22中的Services and Daemons

    Introduction Maintaining security on your system is extremely important, and one approach for this t ...

  9. Fedora 22中的RPM软件包管理工具

    Introduction The RPM Package Manager (RPM) is an open packaging system that runs on Fedora as well a ...

随机推荐

  1. 页码pageNo与SQL的limit进行换算

    /** * 计算出页码 */ public static int getPageNo(int pageNo,int pageSize){ if (pageNo<=1){ return 0; } ...

  2. java源码——计算大于一个数的最小素数

    根据输入数字,计算大于一个数的最小素数. 话不多说,直接贴码. package com.fuxuemingzhu.countprime.main; import java.util.Scanner; ...

  3. 【LeetCode】 202. Happy Number 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 [LeetCode] 题目地址:h ...

  4. 【LeetCode】363. Max Sum of Rectangle No Larger Than K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/max-sum- ...

  5. 【LeetCode】873. Length of Longest Fibonacci Subsequence 解题报告(Python)

    [LeetCode]873. Length of Longest Fibonacci Subsequence 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...

  6. 比赛难度(HDU4546)

    比赛难度 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  7. 更快的Maven来了,我的天,速度提升了8倍!

    周末被 maven-mvnd 刷屏了,于是我也下载了一个 mvnd 体验了一把.虽然测试的数据都是基于我本地项目,不具备普适性和权威性,但也足以说明问题.它的测试结果远远超出我的预期,下面一起来看. ...

  8. 版本不兼容Jar包冲突该如何是好?

    一.引言 "老婆"和"妈妈"同时掉进水里,先救谁? 常言道:编码五分钟,解冲突两小时.作为Java开发来说,第一眼见到ClassNotFoundExceptio ...

  9. 洛谷 P3431:[POI2005]AUT-The Bus(离散化+DP+树状数组)

    题目描述 The streets of Byte City form a regular, chessboardlike network - they are either north-south o ...

  10. Scalable Rule-Based Representation Learning for Interpretable Classification

    目录 概 主要内容 Wang Z., Zhang W., Liu N. and Wang J. Scalable rule-based representation learning for inte ...