定制 slince/tree-samples 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

slince/tree-samples

Composer 安装命令:

composer require slince/tree-samples

包简介

树形结构遍历示例

README 文档

README

Build Status Coverage Status Latest Stable Version Scrutinizer

包含深度优先算法与广度优先算法; 本示例采用的是非递归算法;借用 SplStackSplQueue 实现两种算法的遍历。在开始讲算法之前,我们先创建一个二叉树节点类 Node,源码

class Node
{
    /**
     * @var int
     */
    protected $value;

    /**
     * @var Node
     */
    protected $left;

    /**
     * @var Node
     */
    protected $right;
    
    //...
}

深度优先(DFS)

此算法我们使用的是 Stack,栈的特性是先入后出,借此我们有了如下思路:

  1. 创建一个空的堆栈 SplStack 对象
  2. 将需要遍历的二叉树节点对象压入栈
$stack = new \SplStack();
$stack->push($node);
  1. 循环堆栈对象;
  2. 弹出栈内的第一个节点,此节点即完成遍历;
  3. 将当前访问的节点的右子节点和左子节点先后压入堆栈.
while (!$stack->isEmpty()) {
    $stack->top();
    $node = $stack->pop();
    $visitor($node); //此节点完成访问

    //压右子树
    if ($node->getRight()) {
        $stack->push($node->getRight());
    }
    if ($node->getLeft()) {
        $stack->push($node->getLeft());
    }
}
  1. 循环下去,直到堆栈内节点完全弹出即可完成二叉树的遍历。

完整代码

广度优先(BFS)

此算法我们使用的是 Queue,队列的特性是先入先出,我们的思路如下:

  1. 创建一个空的堆栈 SplQueue 对象
  2. 将需要遍历的二叉树节点对象入队
$queue = new \SplQueue();
$queue->enqueue($node);
  1. 循环队列对象;
  2. 弹出对首的节点,此节点完成访问;
  3. 将当前访问的节点的左子节点和由子节点先后入队.
while (!$stack->isEmpty()) {
    $node = $queue->dequeue();
    $visitor($node); //此节点完成访问
    //压左子树
    if ($node->getLeft()) {
       $queue->push($node->getLeft());
    }
    if ($node->getRight()) {
       $queue->push($node->getRight());
    }
}
  1. 循环下去,直到队列内元素完全弹出。

完整代码

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 我们能提供哪些服务?
定制开发 / 二次开发

基于 slince/tree-samples 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 17
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 9
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 9
  • Watchers: 1
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2018-10-08