PHP如何实现二叉树遍历算法

来源:前端技术作者:广州SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《PHP如何实现二叉树遍历算法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《PHP如何实现二叉树遍历算法》有用,将其分享出去将是对创作者最好的鼓励。

二叉树遍历是指按照特定顺序访问二叉树中的所有节点,常见的遍历方式包括深度优先遍历和广度优先遍历,其中深度优先遍历又分为前序、中序、后序三种类型,下面先介绍PHP中二叉树节点的定义方式。

PHP如何实现二叉树遍历算法

二叉树节点定义

在PHP中实现二叉树遍历前,首先需要定义二叉树节点的结构,每个节点包含自身的值、左子节点和右子节点,具体定义代码如下:

<?php
/**
 * 二叉树节点类
 */
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
/**
 * 前序遍历递归实现
 * @param TreeNode|null $root 根节点
 * @return array 遍历结果数组
 */
function preorderTraversal($root) {
    $result = [];
    if ($root === null) {
        return $result;
    }
    // 先访问根节点
    $result[] = $root->val;
    // 递归遍历左子树
    $result = array_merge($result, preorderTraversal($root->left));
    // 递归遍历右子树
    $result = array_merge($result, preorderTraversal($root->right));
    return $result;
}
?>

如果需要用迭代方式实现前序遍历,可以使用栈来模拟递归过程,代码如下:

<?php
/**
 * 前序遍历迭代实现
 * @param TreeNode|null $root 根节点
 * @return array 遍历结果数组
 */
function preorderTraversalIterative($root) {
    $result = [];
    if ($root === null) {
        return $result;
    }
    $stack = [$root];
    while (!empty($stack)) {
        $node = array_pop($stack);
        // 访问当前节点
        $result[] = $node->val;
        // 右子节点先入栈,保证左子节点先出栈访问
        if ($node->right !== null) {
            array_push($stack, $node->right);
        }
        if ($node->left !== null) {
            array_push($stack, $node->left);
        }
    }
    return $result;
}
?>

中序遍历

中序遍历的顺序是左子树 - 根节点 - 右子树,即先递归遍历左子树,再访问当前节点,最后递归遍历右子树,递归实现代码如下:

<?php
/**
 * 中序遍历递归实现
 * @param TreeNode|null $root 根节点
 * @return array 遍历结果数组
 */
function inorderTraversal($root) {
    $result = [];
    if ($root === null) {
        return $result;
    }
    // 递归遍历左子树
    $result = array_merge($result, inorderTraversal($root->left));
    // 访问根节点
    $result[] = $root->val;
    // 递归遍历右子树
    $result = array_merge($result, inorderTraversal($root->right));
    return $result;
}
?>

后序遍历

后序遍历的顺序是左子树 - 右子树 - 根节点,即先递归遍历左子树,再递归遍历右子树,最后访问当前节点,递归实现代码如下:

<?php
/**
 * 后序遍历递归实现
 * @param TreeNode|null $root 根节点
 * @return array 遍历结果数组
 */
function postorderTraversal($root) {
    $result = [];
    if ($root === null) {
        return $result;
    }
    // 递归遍历左子树
    $result = array_merge($result, postorderTraversal($root->left));
    // 递归遍历右子树
    $result = array_merge($result, postorderTraversal($root->right));
    // 访问根节点
    $result[] = $root->val;
    return $result;
}
?>

广度优先遍历(层次遍历)实现

层次遍历是按照树的层级从上到下、从左到右依次访问所有节点,实现过程需要使用队列来保存每一层的节点,代码如下:

<?php
/**
 * 层次遍历实现
 * @param TreeNode|null $root 根节点
 * @return array 遍历结果数组
 */
function levelOrderTraversal($root) {
    $result = [];
    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;
}
?>

测试示例

我们可以构造一个简单的二叉树来测试上述遍历方法的正确性,测试代码如下:

<?php
// 构造二叉树:根节点1,左子节点2,右子节点3,节点2的左子节点4,节点2的右子节点5
$node4 = new TreeNode(4);
$node5 = new TreeNode(5);
$node2 = new TreeNode(2, $node4, $node5);
$node3 = new TreeNode(3);
$root = new TreeNode(1, $node2, $node3);

echo "前序遍历结果:" . implode(',', preorderTraversal($root)) . PHP_EOL;
echo "中序遍历结果:" . implode(',', inorderTraversal($root)) . PHP_EOL;
echo "后序遍历结果:" . implode(',', postorderTraversal($root)) . PHP_EOL;
echo "层次遍历结果:" . implode(',', levelOrderTraversal($root)) . PHP_EOL;
?>

上述测试代码的输出结果如下:

  • 前序遍历结果:1,2,4,5,3
  • 中序遍历结果:4,2,5,1,3
  • 后序遍历结果:4,5,2,3,1
  • 层次遍历结果:1,2,3,4,5

不同遍历方式适用于不同的场景,比如中序遍历二叉搜索树会得到有序的节点序列,层次遍历适合需要按层级处理节点的场景,开发者可以根据实际需求选择合适的遍历方式。

PHP二叉树遍历前序遍历中序遍历后序遍历修改时间:2026-06-25 20:42:43

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。