[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
发布日期:2021-05-18 07:59:59 浏览次数:12 分类:精选文章

本文共 2625 字,大约阅读时间需要 8 分钟。

如何根据前序和中序遍历重建二叉树

给定二叉树的前序遍历和中序遍历结果,可以通过递归的方法重建二叉树。以下是详细的步骤说明:

  • 确定根节点:前序遍历的第一个元素是根节点。
  • 查找根节点在中序遍历中的位置:遍历中序数组,找到根节点的位置,记为索引p。
  • 分割左子树和右子树
    • 左子树的前序遍历:从根后面的下一个元素开始,直到索引p的位置。
    • 右子树的前序遍历:从索引p开始。
    • 左子树的中序遍历:从中序数组的开始到索引p-1。
    • 右子树的中序遍历:从索引p+1到末尾。
  • 递归构建左子树和右子树:分别对左子树和右子树应用相同的方法,直到所有节点都被处理。
  • 以下是用PHP实现的代码示例:

    class TreeNode {    var $val;    var $left = NULL;    var $right = NULL;    function __construct($val) {        $this->val = $val;    }}function reConstructBinaryTree($pre, $vin) {    $len = count($pre);    if ($len == 0) {        return null;    }    $root = $pre[0];    $node = new TreeNode($root);    // 查找中序数组中根节点的位置    for ($p = 0; $p < $len; $p++) {        if ($vin[$p] == $root) {            break;        }    }    // 分割前序数组    $preLeft = array();    $preRight = array();    for ($i = 0; $i < $len; $i++) {        if ($i < $p) {            $preLeft[] = $pre[$i + 1];        } else if ($i > $p) {            $preRight[] = $pre[$i];        }    }    // 分割中序数组    $vinLeft = array();    $vinRight = array();    for ($i = 0; $i < $len; $i++) {        if ($i < $p) {            $vinLeft[] = $vin[$i];        } else if ($i > $p) {            $vinRight[] = $vin[$i];        }    }    // 递归构建左子树    $node->left = reConstructBinaryTree($preLeft, $vinLeft);    // 递归构建右子树    $node->right = reConstructBinaryTree($preRight, $vinRight);    return $node;}// 示例使用$pre = array(1, 2, 4, 7, 3, 5, 6, 8);$vin = array(4, 7, 2, 1, 5, 3, 8, 6);$node = reConstructBinaryTree($pre, $vin);var_dump($node);

    输出结果

    object(TreeNode)#1 (3) {    ["val"]=>    int(1)    ["left"]=>    object(TreeNode)#2 (3) {        ["val"]=>        int(2)        ["left"]=>        object(TreeNode)#3 (3) {            ["val"]=>            int(4)            ["left"]=>            NULL            ["right"]=>            object(TreeNode)#4 (3) {                ["val"]=>                int(7)                ["left"]=>                NULL                ["right"]=>                NULL            }        }        ["right"]=>        NULL    }    ["right"]=>    object(TreeNode)#5 (3) {        ["val"]=>        int(3)        ["left"]=>        object(TreeNode)#6 (3) {            ["val"]=>            int(5)            ["left"]=>            NULL            ["right"]=>            NULL        }        ["right"]=>        object(TreeNode)#7 (3) {            ["val"]=>            int(6)            ["left"]=>            object(TreeNode)#8 (3) {                ["val"]=>                int(8)                ["left"]=>                NULL                ["right"]=>                NULL            }            ["right"]=>            NULL        }    }}

    通过上述方法,可以成功地从前序和中序遍历结果中重建出对应的二叉树结构。

    上一篇:[PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
    下一篇:[PHP] 算法-构建排除当前元素的乘积数组的PHP实现

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月20日 08时47分02秒