slince/tree-samples
Composer 安装命令:
composer require slince/tree-samples
包简介
树形结构遍历示例
关键字:
README 文档
README
包含深度优先算法与广度优先算法; 本示例采用的是非递归算法;借用 SplStack 和 SplQueue
实现两种算法的遍历。在开始讲算法之前,我们先创建一个二叉树节点类 Node,源码:
class Node { /** * @var int */ protected $value; /** * @var Node */ protected $left; /** * @var Node */ protected $right; //... }
深度优先(DFS)
此算法我们使用的是 Stack,栈的特性是先入后出,借此我们有了如下思路:
- 创建一个空的堆栈
SplStack对象 - 将需要遍历的二叉树节点对象压入栈
$stack = new \SplStack(); $stack->push($node);
- 循环堆栈对象;
- 弹出栈内的第一个节点,此节点即完成遍历;
- 将当前访问的节点的右子节点和左子节点先后压入堆栈.
while (!$stack->isEmpty()) { $stack->top(); $node = $stack->pop(); $visitor($node); //此节点完成访问 //压右子树 if ($node->getRight()) { $stack->push($node->getRight()); } if ($node->getLeft()) { $stack->push($node->getLeft()); } }
- 循环下去,直到堆栈内节点完全弹出即可完成二叉树的遍历。
广度优先(BFS)
此算法我们使用的是 Queue,队列的特性是先入先出,我们的思路如下:
- 创建一个空的堆栈
SplQueue对象 - 将需要遍历的二叉树节点对象入队
$queue = new \SplQueue(); $queue->enqueue($node);
- 循环队列对象;
- 弹出对首的节点,此节点完成访问;
- 将当前访问的节点的左子节点和由子节点先后入队.
while (!$stack->isEmpty()) { $node = $queue->dequeue(); $visitor($node); //此节点完成访问 //压左子树 if ($node->getLeft()) { $queue->push($node->getLeft()); } if ($node->getRight()) { $queue->push($node->getRight()); } }
- 循环下去,直到队列内元素完全弹出。
Usage
Installation:
$ composer require slince/tree-samples
Basic Usage:
// 创建三个节点的二叉树 $leftChild = new Slince\Tree\Node(2); $rightChild = new Slince\Tree\Node(3); $node = new Slince\Tree\Node(1, $leftChild, $rightChild); // 使用宽度优先算法遍历 $bfs = new Slince\Tree\Traversal\BFS(); $numbers = []; $bfs->travel($node, function(Node $node) use(&$numbers){ $numbers[] = $node->getValue(); }); // 输出遍历顺序 echo implode(',', $numbers); // 1,2,3 // 使用深度优先算法遍历 $dfs = new Slince\Tree\Traversal\DFS(); $numbers = []; $bfs->travel($node, function(Node $node) use(&$numbers){ $numbers[] = $node->getValue(); }); // 对于三个节点的二叉树,dfs和bfs的遍历顺序是一样的,有兴趣的可以自行尝试7个节点的二叉树遍历。
LICENSE
MIT 协议;
slince/tree-samples 适用场景与选型建议
slince/tree-samples 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 17 次下载、GitHub Stars 达 9, 最近一次更新时间为 2018 年 10 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「tree」 「tree-travel」 「�」 「叉树」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 slince/tree-samples 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 slince/tree-samples 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 slince/tree-samples 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
jsTree widget for yii2
Doctrine2 behavior traits - slowhop fork
A fast and dynamic Merkle tree implementation
Data structure collections, helpers and utilities for yii2 ActiveRecord models(trees, sorts and etc.)
Yii2 DynaTree Menu widget uses Dynamic tree view control jquery.dynatree.js
JQuery ZTree Yii2
统计信息
- 总下载量: 17
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 9
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-10-08