PHP 实现二叉树层序遍历

6次阅读

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

PHP 实现二叉树层序遍历

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()

不复杂但容易忽略细节。

text=ZqhQzanResources