PHPackages                             slince/tree-samples - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. slince/tree-samples

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

slince/tree-samples
===================

树形结构遍历示例

0.0.1(7y ago)9171MITPHP

Since Oct 8Pushed 7y ago1 watchersCompare

[ Source](https://github.com/slince/tree-samples)[ Packagist](https://packagist.org/packages/slince/tree-samples)[ RSS](/packages/slince-tree-samples/feed)WikiDiscussions master Synced 2d ago

READMEChangelogDependencies (1)Versions (2)Used By (0)

PHP版本二叉树遍历算法
============

[](#php版本二叉树遍历算法)

[![Build Status](https://camo.githubusercontent.com/ce06a38d032934a6538ce9370f86fd3cf3838afbf71f9aefa79c67b288c35b01/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f736c696e63652f747265652d73616d706c65732f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/slince/tree-samples)[![Coverage Status](https://camo.githubusercontent.com/6ae43d728e27cab3dc652ced3757e92700fb41caa64e39f00abd6734a6185c8d/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f736c696e63652f747265652d73616d706c65732e7376673f7374796c653d666c61742d737175617265)](https://codecov.io/github/slince/tree-samples)[![Latest Stable Version](https://camo.githubusercontent.com/495479b9d85e0ee84996c7ee021cecaa4fd0172c8485f24f9d6b5890f5de1941/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f736c696e63652f747265652d73616d706c65732e7376673f7374796c653d666c61742d737175617265266c6162656c3d737461626c65)](https://packagist.org/packages/slince/tree-samples)[![Scrutinizer](https://camo.githubusercontent.com/94ee600a7ddb76f3d7aabb2e6336514aa257cffc526e6a957424751f7c0135b8/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f736c696e63652f747265652d73616d706c65732e7376673f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/slince/tree-samples/?branch=master)

包含深度优先算法与广度优先算法; 本示例采用的是非递归算法；借用 `SplStack` 和 `SplQueue`实现两种算法的遍历。在开始讲算法之前，我们先创建一个二叉树节点类 `Node`,[源码](./src/Node.php)：

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

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

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

    //...
}
```

深度优先（DFS）
---------

[](#深度优先dfs)

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

1. 创建一个空的堆栈 `SplStack` 对象
2. 将需要遍历的二叉树节点对象压入栈

```
$stack = new \SplStack();
$stack->push($node);
```

3. 循环堆栈对象；
4. 弹出栈内的第一个节点，此节点即完成遍历；
5. 将当前访问的节点的右子节点和左子节点先后压入堆栈.

```
while (!$stack->isEmpty()) {
    $stack->top();
    $node = $stack->pop();
    $visitor($node); //此节点完成访问

    //压右子树
    if ($node->getRight()) {
        $stack->push($node->getRight());
    }
    if ($node->getLeft()) {
        $stack->push($node->getLeft());
    }
}
```

6. 循环下去，直到堆栈内节点完全弹出即可完成二叉树的遍历。

[完整代码](./src/Traversal/DFS.php)

广度优先（BFS）
---------

[](#广度优先bfs)

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

1. 创建一个空的堆栈 `SplQueue` 对象
2. 将需要遍历的二叉树节点对象入队

```
$queue = new \SplQueue();
$queue->enqueue($node);
```

3. 循环队列对象；
4. 弹出对首的节点，此节点完成访问；
5. 将当前访问的节点的左子节点和由子节点先后入队.

```
while (!$stack->isEmpty()) {
    $node = $queue->dequeue();
    $visitor($node); //此节点完成访问
    //压左子树
    if ($node->getLeft()) {
       $queue->push($node->getLeft());
    }
    if ($node->getRight()) {
       $queue->push($node->getRight());
    }
}
```

6. 循环下去，直到队列内元素完全弹出。

[完整代码](./src/Traversal/BFS.php)

Usage
-----

[](#usage)

### Installation：

[](#installation)

```
$ composer require slince/tree-samples
```

### Basic Usage：

[](#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
-------

[](#license)

MIT 协议；

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity13

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

2775d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3785826?v=4)[Tao](/maintainers/slince)[@slince](https://github.com/slince)

---

Top Contributors

[![slince](https://avatars.githubusercontent.com/u/3785826?v=4)](https://github.com/slince "slince (8 commits)")

---

Tags

bfsdfstraversaltreetreetree-travel

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/slince-tree-samples/health.svg)

```
[![Health](https://phpackages.com/badges/slince-tree-samples/health.svg)](https://phpackages.com/packages/slince-tree-samples)
```

###  Alternatives

[knplabs/knp-menu

An object oriented menu library

1.4k55.8M287](/packages/knplabs-knp-menu)[cuyz/valinor

Dependency free PHP library that helps to map any input into a strongly-typed structure.

1.5k9.2M108](/packages/cuyz-valinor)[bluem/tree

Library for handling tree structures based on parent IDs

252916.1k7](/packages/bluem-tree)[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

320392.1k17](/packages/codewithdennis-filament-select-tree)[loophp/phptree

An implementation of tree data structure

981.8M2](/packages/loophp-phptree)[kartik-v/yii2-tree-manager

An enhanced tree management module with tree node selection and manipulation using nested sets.

156529.0k15](/packages/kartik-v-yii2-tree-manager)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
