大部分文章中包含视频,请点击文章标题进入文章页面查看
回忆一下小学的除法:12除以3等于几?13除以3等于几?14、15、16分别除以3的结果?
有的能被整除,有的会产生“余数”。这里的余数可以暂时理解为取模运算的结果,我们使用 % 表示取模运算。
先不讨论负数的情况,在对一个正数X进行取模运算时,规律是这样的:
X % y = z (z的取值为 0 到 y-1)。
如任意一个正整数 X % 10 的结果:0-9
可以使用计算器计算:



PHP中的取模运算:
$a = 100;
$b = 6;
$c = $a % $b;
更多资料:

- 为什么使用签名
- 签名的原理
- 哈希算法
- php的md5()函数
- 如何生成签名
- 如何验证签名
- 爬虫简介
- 爬虫的工作原理
- 如何使用PHP实现一个爬虫
- 抓取PHP函数文档
构造一个二叉树,如图

使用递归的方式遍历此二叉树。
C语言实现代码:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Node
{
DataType data; //数据域
struct Node * lchild; //指向左孩子
struct Node * rchild; //指向右孩子
}BtNode;
//访问节点的函数
void visit(BtNode * node)
{
printf("data = %d\n",node->data);
}
//先序遍历二叉树 根 - 左 - 右
void PreOrder(BtNode * root)
{
if(root)
{
//访问根
visit(root);
PreOrder(root->lchild); //先序遍历左子树
PreOrder(root->rchild); //先序遍历右子树
}
}
int main()
{
//构造一个二叉树
BtNode * tree = (BtNode *)malloc(sizeof(BtNode)); //从内存中分配空间
tree->data = 1;
BtNode * node2 = (BtNode *)malloc(sizeof(BtNode));
node2->data = 2;
BtNode * node3 = (BtNode *)malloc(sizeof(BtNode));
node3->data = 3;
BtNode * node4 = (BtNode *)malloc(sizeof(BtNode));
node4->data = 4;
BtNode * node5 = (BtNode *)malloc(sizeof(BtNode));
node5->data = 5;
BtNode * node6 = (BtNode *)malloc(sizeof(BtNode));
node6->data = 6;
BtNode * node7 = (BtNode *)malloc(sizeof(BtNode));
node7->data = 7;
tree->lchild = node2;
tree->rchild = node3;
node2->lchild = node4;
node2->rchild = node5;
node3->lchild = NULL;
node3->rchild = node6;
node4->lchild = NULL;
node4->rchild = NULL;
node5->lchild = node7;
node5->rchild = NULL;
node6->lchild = NULL;
node6->rchild = NULL;
node7->lchild = NULL;
node7->rchild = NULL;
PreOrder(tree);
return 0;
}
以上代码可在Linux中使用Gcc编译。
二叉树的链式存储之二叉链表。
在单链表中,节点包含两部分,数据域(data)与指针域(next),如图:

数据域用来保存数据(可以是任意类型),指针域用来保存后继节点的地址,所有节点通过指针连在一起。
在二叉链表中,每个节点由三部分组成: 左指针(指向左孩子)、右指针(指向右孩子)、数据域(保存数据),如图:

二叉树的遍历:
- 先序遍历(根-左-右)
- 中序遍历(左-根-右)
- 后序遍历(左-右-根)
- 层次遍历(有多少层)
二叉树的定义中包含了递归的意思,再继续解读,其实左子树和右子树的左右子树其实也还是二叉树,所以可以使用递归进行遍历。
对于先序遍历,遍历的顺序为:访问根节点->先序遍历左子树->先序遍历右子树;
同理,中序遍历:中序遍历左子树->访问根节点->中序遍历右子树;
后序遍历:后续遍历左子树->后序遍历右子树->访问根节点。
二叉树的性质:
- 1、二叉树第 i 层上最多有
个节点
- 2、深度为k的二叉树至多有
个节点
- 3、对任何一个二叉树,若度数为0的节点个数为
,度数为2的节点个数为
,则
- 4、含有n个节点的完全二叉树的深度为
,(
的值向下取整,即舍去小数点)
- 5、将一个含有n个节点的完全二叉树按层编号(从上到下,从左到右),则对任一编号i节点A:①若i=1,则A节点是根;若i>1,则A的双亲Parent(A)编号为 i/2(向下取整);②若2*i>n,则A既无左孩子也无右孩子,否则A的左孩子Lchild(A)=2*i;③若2*i+1>n,则节点A无右孩子;否则,A的右孩子Rchild(A)的编号为2*i+1;
满二叉树:深度为k(k≥1)且有 个节点的二叉树(节点数已达最大值)
完全二叉树:对满二叉树从上到下,从左到右的顺序编号,并在最下一层删去部分节点,如果删除的这些节点的编号是连续的且删除的节点中含有最大编号的节点,那么这棵树就是完全二叉树。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。
视频内容:
- 二叉树(Binary Tree)的基本概念
二叉树的定义:
是n(n≥0)个元素的有限集合,该集合或者为空,或者由一个根及两棵互不相交的左子树和右子树组成,其中左子树和右子树也均为二叉树。
二叉树中的“二”如何理解?
- 二就是2,二就是two
- 有左右(有序)
二叉树的五种形态:
- 空二叉树
- 只有一个根节点的二叉树(左右子树为空)
- 右子树为空的二叉树
- 左子树为空的二叉树
- 左右子树都非空的的二叉树(既有左子树又有右子树)
子树也是二叉树,满足二叉树的五种形态
二叉树的基本运算:
- 初始化
- 求双亲
- 求左孩子、求右孩子
- 建二叉树
- 先序遍历
- 中序遍历
- 后续遍历
- 层次遍历
如何购买阿里云服务器
视频内容:
- 如何购买阿里云服务器?
- 配置如何选择?
- 防火墙与安全组?
- 带宽如何选择?
本质上讲,服务器就是一台计算机,由CPU,内存,磁盘,网卡等一堆硬件组成,如果要让它运行起来提供服务还得安装很多软件。比如要先安装操作系统,操作系统又分很多种类,我们熟悉的Windows系列(Win7 Win8 Win10),苹果(MAC OS),Linux(RedHat Ubuntu)等等。有了操作系统之后,才能安装各种软件(应用程序)。我们平时使用的各种软件 QQ、微信、浏览器、PhotoShop等其实都是应用程序。这些程序的运行都离不开操作系统。
我们平时访问的网站就是运行在服务器上面,一个网站由很多部分(后面称服务)组成,而不同的组成部分可能运行在不同的服务器上。比如一个简单的个人博客(wordpress),需要HTTP服务(Nginx或Apache),数据库服务(MySQL)和网站程序(PHP)。
服务其实就是运行的软件提供的功能,比如数据库服务需要运行数据库软件(MySQL),HTTP服务需要运行能够提供HTTP服务功能的软件(Apache或者Nginx)。那么一个服务器上面安装了什么软件,我们就可以称这个服务器为XX服务器。比如一台服务器上安装了MySQL,我们就可以说它是数据库服务器。当然也可以在一台服务器上安装多个软件,这个服务器就是包含各种服务的服务器。
云服务器有很多,国内的比如阿里云、百度云、腾讯云、七牛云等等。我们以阿里云为例,官方网站:https://www.aliyun.com/
服务器买什么样的配置?就像我们去买电脑一样,买个这个电脑做什么?我的钱包允许我买什么配置的?具体看用途,如果只是办公,简单配置就好,如果是游戏玩家,那就要高配。服务器也一样。
购买云服务器需要重点关注的以下几个配置:
- CPU(越多越好)
- 内存(越大越好)
- 存储(越大越好)
- 带宽 (越“宽”越好)
当然,还是要控制成本滴。
购买阿里云服务器的基本步骤(具体看视频):
- 1、要有个阿里云账号。
- 2、打开阿里云官方网站(https://www.aliyun.com/),选择“控制台”登录。
- 3、产品与服务里找到“云服务器ECS”,创建实例。
- 4、根据自己的实际情况选择合适的配置。
在刚装完好环境后(Nginx 与 PHP-FPM),Nginx报了502,应该如何解决?
两个问题:
- Nginx报502是Nginx出错了吗?Nginx没有出错,如果Nginx出错你可能已经看不到报错了。
- Nginx如何与PHP-FPM通信?本质上是进程间通信。通信不畅,则报错。Nginx连不上PHP-FPM,就报了502
Nginx有两种方式连接PHP-FPM。
- IP + PORT :比如Nginx配置文件中的 fastcgi_pass 127.0.0.1:9000
- socket文件:比如Nginx配置文件中的 fastcgi_pass unix:/tmp/php.sock
对于第一种方式(IP + PORT):Nginx通过IP与端口去找PHP-FPM,通常我们将Nginx与PHP-FPM安装在同一主机上,所以ip为127.0.0.1;PHP-FPM默认端口为9000(可以修改),所以Nginx会找本地的9000端口,使用命令 netstat -tlunp | grep php-fpm查看PHP-FPM的端口信息
,如果命令没有返回,可能没有启动PHP-FPM进程。如果看到的端口不是9000,有两种方法解决:1、修改Nginx配置文件中fastcgi_pass中的端口。2、修改PHP-FPM配置文件中的端口(listen = 127.0.0.1:port)。
对于第二种方式(socket文件):检查PHP-FPM配置文件中 listen 配置项是否也是 socket文件形式,如果不是有两种方法解决:1 PHP-FPM配置文件中listen改成 socket文件形式,与Nginx中配置保持一致。2、修改Nginx配置文件,与PHP-FPM配置文件中的listen 保持一致。
总结:同时检查Nginx配置文件与PHP-FPM配置文件,并配合查看进程与端口。