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]] 这类二维数组,关键是在每轮循环中处理“当前层全部节点”:
- 每次进入 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()
不复杂但容易忽略细节。