0%

题目地址

https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

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

示例:

你可以将以下二叉树:

1
/ \
2 3
/ \
4 5

序列化为 "[1,2,3,null,null,4,5]"

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

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

解题思路

序列化与反序列化成对存在,可以有不同的序列化方法,但必须通过反序列化还原成先前的数据结构或对象。

二叉树的序列化可以理解成是将二维结构转化为一维的数组或字符串,但考虑到节点的值可能为负数,数组更为合适。

本例采用前序遍历的方式,将二叉树转化为数组,其中空节点的值用‘#’代替。

本来通过前序遍历的结果是没办法还原二叉树的,至少也要前中后序遍历中的两个,但序列化后的结果包括二叉树中空指针的信息,所以反序列化是可行的。

反序列化过程也是一样,先确定根节点 root,然后遵循前序遍历的规则,递归生成左右子树。

代码实现 此例有待优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
javascript
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/

/**
* Encodes a tree to a single string.
*
* @param {TreeNode} root
* @return {string}
*/
var serialize = function(root) {
// 初始化一个全局的数组
let array = [];
function serialize1(root) {
if (!root) {
array.push('#');
return;
}
array.push(root.val);
serialize1(root.left);
serialize1(root.right);
}
serialize1(root);
return array;
};

/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
function deserialize1() {
if (data === []) {
return;
}
if (data[0] === '#') {
data = data.slice(1);
return null;
}
const root = new TreeNode(data[0]);
data = data.slice(1);
root.left = deserialize1();
root.right = deserialize1();
return root;
}
return deserialize1();
};

/**
* Your functions will be called as such:
* deserialize(serialize(root));
*/

解决hexo init因网络克隆不了的问题

因为hexo init克隆了两个github仓库以及安装了一些包依赖,所以如果因为网络原因导致clone不了而报错的话,可以在gitee上克隆这两个仓库然后自己安装包依赖

hexo的命令

hexo -v 查看版本
hexo init 用来初始化,会git clone生成一些目录和文件
hexo s 启动服务器
hexo n “文件名” 创建博客文章,会自动添加.md后缀
hexo n后hexo clean清除数据库,再hexo g生成才能起效果
hexo n page ‘目录名’ 会在source里创建一个目录

vue使用router之前正常,之后一片空白,也没有报错

找错找到吐血,结果发现是配置路由路径的时候routes前面没有写const

查linux系统版本

1 键入如下命令

1
uname -a

2 查看文件,不同linux系统可能不一样

  1. 行内元素

特点:就可以和其他元素在一行显示,不能自动换行,不能设置宽高

常见行内元素:a,span,i,u,em,sub,sup

  1. 块级元素

特点:不可以和他的元素在一行,可以自动换行,可以设置宽高

常见的块级元素:div,p,h,ul,li,dl,dt,dd

  1. 行内块级元素

特点:可以和其他元素保持在一行,还能设置宽高

常见元素:textarea,input,img,button

1. 推荐方案

1
git pull

git pull先将本地库更新到与远程库一致的版本,但要注意本地库后来做的修改可能被覆盖

1
git fetch

最好使用git fetch(不会自动合并),查看更新情况再有选择合并,或者先将本地库修改过的文件备份,git pull后再重新修改
再运行git push即可成功。

2. 暴力方案

1
git push -f

git提供了一种强制上传的方式:git push -f ,它会忽略版本不一致等问题,强制将本地库上传的远程库,但是一定要谨慎使用,因为-f会用本地库覆盖掉远程库,如果远程库上有重要更新,或者有其他同伴做的修改,也都会被覆盖,所以一定要在确定无严重后果的前提下使用此操作。

mysql数据库连接报错信息Client does not support authentication protocol requested by server解决办法

报错信息

1
Client does not support authentication protocol requested by server

解决办法

1
2
3
1、use mysql;
2、alter user 'root'@'localhost' identified with mysql_native_password by '数据库密码';
3、flush privileges;

  1. 显示数据库列表
    show databases;

  2. 建库
    create database 库名;

  3. 查用户
    select user,host from mysql.user;

  4. 删用户
    drop user 用户名@主机;

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。

docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。

  1. 不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。比如IIS和Apache访问端口冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。
  2. 你开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。
  3. 在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。

总之docker就是集装箱原理。