
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
确定根节点:前序遍历的第一个元素是根节点。 查找根节点在中序遍历中的位置:遍历中序数组,找到根节点的位置,记为索引p。 分割左子树和右子树: 递归构建左子树和右子树:分别对左子树和右子树应用相同的方法,直到所有节点都被处理。
发布日期:2021-05-18 07:59:59
浏览次数:12
分类:精选文章
本文共 2625 字,大约阅读时间需要 8 分钟。
如何根据前序和中序遍历重建二叉树
给定二叉树的前序遍历和中序遍历结果,可以通过递归的方法重建二叉树。以下是详细的步骤说明:
- 左子树的前序遍历:从根后面的下一个元素开始,直到索引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 } }}
通过上述方法,可以成功地从前序和中序遍历结果中重建出对应的二叉树结构。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月20日 08时47分02秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
DCMTK:存储服务类用户(C-STORE操作)
2019-03-14
带照片捕捉功能的ESP32-CAM PIR运动检测器
2019-03-15
如何使用SSH远程管理Linux服务器
2019-03-15
降级到旧版本macOS的3种方法
2019-03-15
学习Vue.js2.0(国外视频教程)
2019-03-15
在FPGA板上实现数字时钟的VHDL代码
2019-03-15
wxPython和PyOpenGL视频
2019-03-15
在30分钟内学习PHP
2019-03-15
Python http.server 服务器
2019-03-15
Python svm 支持向量机
2019-03-15
OpenStack 最小化安装配置(一):物理机网桥配置
2019-03-15
PS快速美白照片
2019-03-15
ubuntu 16.04 镜像下载
2019-03-15
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
2019-03-15
微信小程序云开发:怎么删除云函数?已解决
2019-03-15
什么是句柄(经典)
2019-03-15
第一次被黑
2019-03-15