前言
这篇文章是介绍 二叉树 和 二分搜索树,然后通过 PHP 代码定义一下 二分搜索树 的节点,使用递归思想操作向二分搜索树添加元素,然后实现了递归判断二分搜索树上是否包含某个元素,最后分别实现了前序遍历、中序遍历、后序遍历 二分搜索树。
1.二叉树
1.1 二叉树图示
1.2 二叉树节点定义
//二叉树具有唯一根节点 class Node{ $e; //节点元素 $left; //左儿子 $right;//右儿子 }
Tips:二叉树每个节点最多有两个儿子,每个节点最多有一个父亲。
1.3 二叉树的特点
- 二叉树具有天然的递归结构,每个节点的左儿子或右儿子也是 二叉树。
- 二叉树不一定是满的,可能只有左儿子或又儿子。
- 一个节点或 NULL 也可以看做一个二叉树。
2.二分搜索树
2.1 二分搜索树特点
- 二分搜索树是二叉树。
- 每个节点的元素的值都要大于左儿子所有节点的值。
- 每个节点的元素的值都要小于右儿子所有节点的值。
- 每个子树也是二分搜索树。
- 二分搜索树查询速度快。
- 存储的元素必须要有比较性。
2.2 二分搜索树图示
2.3 PHP 代码定义节点
class Node { public $e; public $left = null; public $right = null; /** * 构造函数 初始化节点数据 * Node constructor. * @param $e */ public function __construct($e) { $this->e = $e; } }
2.4 向二分搜索树添加元素
下面展示的的使用递归思想向二分搜索树添加元素,其中 add($e) 方法表示想二分搜索树添加元素 $e,recursionAdd(Node $root, $e) 是一个递归函数,表示使用递归向二分搜索树添加元素:
/** * 向二分搜索树添加元素 * @param $e */ public function add($e) { $this->root = $this->recursionAdd($this->root, $e); } /** * 递归向二分搜索树添加元素 * @param Node $root * @param $e */ public function recursionAdd(Node $root, $e) { if ($root == null) { //若节点为空则添加元素 并且返回当前节点信息 $this->size++; $root = new Node($e); } elseif ($e < $root->e) { //若元素小于当前节点元素 则向左节点递归添加元素 $root->left = $this->recursionAdd($root->left, $e); } elseif ($e > $root->e) { //若元素大于当前节点元素 则向右节点递归添加元素 $root->right = $this->recursionAdd($root->right, $e); } //若元素等于当前节点元素 则什么都不做 }
Tips:这里的二分搜索树不包含重复元素,如果想要包含重复元素,可以定义每个左儿子所有元素小于等于父亲节点,或者每个节点右儿子所有节点元素大于等于父亲节点。
2.5 查询二分搜索树是否包含某个元素
下面展示的的使用递归思想查询二分搜索树元素是否包含某个元素,其中 contains($e) 方法表示查询二分搜索树是否包含元素 $e,recursionContains(Node $root, $e) 是一个递归函数,表示使用递归查询二分搜索树元素:
/** * 判断二分搜索树是否包含某个元素 * @param $e * @return bool */ public function contains($e): bool { return $this->recursionContains($this->root, $e); } /** * 递归判断二分搜索树是否包含某元素 * @param $root * @param $e * @return bool */ private function recursionContains(Node $root, $e): bool { if ($root == null) { //若当前节点为空 则表示不存在元素 $e return false; } elseif ($e == $root->e) { //若 $e 等于当前节点元素,则表示树包含元素 $e return true; } elseif ($e < $root->e) { //若 $e 小于当前节点元素,则去左儿子树递归查询是否包含节点 return $this->recursionContains($root->left, $e); } else { //若 $e 大于当前节点元素,则去右儿子树递归查询是否包含节点 return $this->recursionContains($root->right, $e); } }
Tips:递归的时候会比较元素和节点的值,递归的时候判断元素大小相当于 “指路”,最终指向到的位置就是判断是否包含元素是否存在的依据。
2.6 二分搜索树前序遍历
前序遍历操作就是把所有节点都访问一次,前序遍历 是先访问节点,再递归遍历左儿子树,然后再递归遍历右儿子树:
/** * 前序遍历 */ public function preTraversal() { $this->recursionPreTraversal($this->root, 0); } /** * 前序遍历的递归 */ public function recursionPreTraversal($root, $sign_num) { echo $this->getSign($sign_num);//打印深度 if ($root == null) { echo "null<br>"; return; } echo $root->e . "<br>"; //打印当前节点元素 $this->recursionPreTraversal($root->left, $sign_num + 1); $this->recursionPreTraversal($root->right, $sign_num + 1); }
下面是打印结果:
<"htmlcode">
/** * 中序遍历 */ public function midTraversal() { $this->recursionMidTraversal($this->root, 0); } /** * 中序遍历的递归 */ public function recursionMidTraversal($root, $sign_num) { if ($root == null) { echo $this->getSign($sign_num);//打印深度 echo "null<br>"; return; } $this->recursionMidTraversal($root->left, $sign_num + 1); echo $this->getSign($sign_num);//打印深度 echo $root->e . "<br>"; $this->recursionMidTraversal($root->right, $sign_num + 1); }下面是打印结果:
<"htmlcode">
/** * 后序遍历 */ public function rearTraversal() { $this->recursionRearTraversal($this->root, 0); } /** * 后序遍历的递归 */ public function recursionRearTraversal($root, $sign_num) { if ($root == null) { echo $this->getSign($sign_num);//打印深度 echo "null<br>"; return; } $this->recursionRearTraversal($root->left, $sign_num + 1); $this->recursionRearTraversal($root->right, $sign_num + 1); echo $this->getSign($sign_num);//打印深度 echo $root->e . "<br>"; }下面是打印结果:
<"external nofollow" target="_blank" href="https://gitee.com/love-for-poetry/data-structure">https://gitee.com/love-for-po...
总结
php,二分搜索树,搜索php
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。