php二叉树层序遍历核心是队列fifo:先定义treenode类,再用数组模拟队列(array_shift/array_push)实现逐层访问;进阶需按层分组则记录每层节点数;大数据量推荐splqueue提升性能。

PHP 实现二叉树层序遍历,核心是使用队列(FIFO)逐层访问节点:先根,再左右子节点,依次向下推进。
定义二叉树节点结构
先创建标准的 TreeNode 类,包含值、左子节点和右子节点:
class TreeNode {
public $val;
public $left;
public $right;
public function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}
用数组模拟队列实现层序遍历
PHP 中可用 array_shift() 模拟出队(注意性能,小规模树无压力),配合 array_push() 入队:
- 初始化队列,把根节点入队
- 当队列非空时,循环取出队首节点
- 记录当前节点值,再将其非空的左右子节点依次入队
function levelOrder($root) {
if ($root === null) return [];
$result = [];
$queue = [$root];
while (!empty($queue)) {
$node = array_shift($queue);
$result[] = $node->val;
if ($node->left !== null) {
array_push($queue, $node->left);
}
if ($node->right !== null) {
array_push($queue, $node->right);
}
}
return $result;
}
按层分组返回(进阶需求)
若需返回 [[3], [9,20], [15,7]] 这类二维数组,关键是在每轮循环中处理“当前层全部节点”:
立即学习“PHP免费学习笔记(深入)”;
- 每次进入 while 循环前,记录当前队列长度 $size
- 内层 for 循环执行 $size 次,确保只处理本层节点
- 每层结果单独 push 到 $result 中
function levelOrderGrouped($root) {
if ($root === null) return [];
$result = [];
$queue = [$root];
while (!empty($queue)) {
$size = count($queue);
$level = [];
for ($i = 0; $i < $size; $i++) {
$node = array_shift($queue);
$level[] = $node->val;
if ($node->left !== null) {
array_push($queue, $node->left);
}
if ($node->right !== null) {
array_push($queue, $node->right);
}
}
$result[] = $level;
}
return $result;
}
性能与替代方案提醒
频繁 array_shift() 在大数据量时会引发 O(n) 时间开销。生产环境可改用 SplQueue 提升效率:
- SplQueue 是 PHP 内置双链表队列,enqueue() 和 dequeue() 均为 O(1)
- 只需将 $queue = new SplQueue(); 替换数组初始化
- 入队用 $queue->enqueue($node),出队用 $queue->dequeue()
不复杂但容易忽略细节。











