php实现的二叉树遍历算法示例


Posted in PHP onJune 15, 2017

本文实例讲述了php实现的二叉树遍历算法。分享给大家供大家参考,具体如下:

今天使用php来实现二叉树的遍历

创建的二叉树如下图所示

php实现的二叉树遍历算法示例

php代码如下所示:

<?php
class Node {
  public $value;
  public $child_left;
  public $child_right;
}
final class Ergodic {
  //前序遍历:先访问根节点,再遍历左子树,最后遍历右子树;并且在遍历左右子树时,仍需先遍历根节点,然后访问左子树,最后遍历右子树
  public static function preOrder($root){
    $stack = array();
    array_push($stack, $root);
    while(!empty($stack)){
      $center_node = array_pop($stack);
      echo $center_node->value . ' ';
      //先把右子树节点入栈,以确保左子树节点先出栈
      if($center_node->child_right != null) array_push($stack, $center_node->child_right);
      if($center_node->child_left != null) array_push($stack, $center_node->child_left);
    }
  }
  //中序遍历:先遍历左子树、然后访问根节点,最后遍历右子树;并且在遍历左右子树的时候。仍然是先遍历左子树,然后访问根节点,最后遍历右子树
  public static function midOrder($root){
    $stack = array();
    $center_node = $root;
    while (!empty($stack) || $center_node != null) {
      while ($center_node != null) {
        array_push($stack, $center_node);
        $center_node = $center_node->child_left;
      }
      $center_node = array_pop($stack);
      echo $center_node->value . ' ';
      $center_node = $center_node->child_right;
    }
  }
  //后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点;同样,在遍历左右子树的时候同样要先遍历左子树,然后遍历右子树,最后访问根节点
  public static function endOrder($root){
    $push_stack = array();
    $visit_stack = array();
    array_push($push_stack, $root);
    while (!empty($push_stack)) {
      $center_node = array_pop($push_stack);
      array_push($visit_stack, $center_node);
      //左子树节点先入$pushstack的栈,确保在$visitstack中先出栈
      if ($center_node->child_left != null) array_push($push_stack, $center_node->child_left);
      if ($center_node->child_right != null) array_push($push_stack, $center_node->child_right);
    }
    while (!empty($visit_stack)) {
      $center_node = array_pop($visit_stack);
      echo $center_node->value . ' ';
    }
  }
}
//创建二叉树
$a = new Node();
$b = new Node();
$c = new Node();
$d = new Node();
$e = new Node();
$f = new Node();
$g = new Node();
$h = new Node();
$i = new Node();
$a->value = 'A';
$b->value = 'B';
$c->value = 'C';
$d->value = 'D';
$e->value = 'E';
$f->value = 'F';
$g->value = 'G';
$h->value = 'H';
$i->value = 'I';
$a->child_left = $b;
$a->child_right = $c;
$b->child_left = $d;
$b->child_right = $g;
$c->child_left = $e;
$c->child_right = $f;
$d->child_left = $h;
$d->child_right = $i;
//前序遍历
Ergodic::preOrder($a); //结果是:A B D H I G C E F
echo '<br/>';
//中序遍历
Ergodic::midOrder($a); //结果是: H D I B G A E C F
echo '<br/>';
//后序遍历
Ergodic::endOrder($a); //结果是: H I D G B E F C A

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
Feb 18 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
Jun 27 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
PHP会话处理的10个函数
Aug 11 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
php curl 模拟登录并获取数据实例详解
Dec 22 PHP
THINKPHP截取中文字符串函数实例代码
Mar 20 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 #PHP
PHP中phar包的使用教程
Jun 14 #PHP
iis 7下安装laravel 5.4环境的方法教程
Jun 14 #PHP
PHP中关键字interface和implements详解
Jun 14 #PHP
详解php中的implements 使用
Jun 13 #PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 #PHP
php 中的closure用法详解
Jun 12 #PHP
You might like
Smarty+QUICKFORM小小演示
2007/02/25 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
微信小程序实现电影App导航和轮播
2020/11/30 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
python实现音乐下载器
2018/04/15 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
pytorch 实现tensor与numpy数组转换
2019/12/27 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
软件工程师岗位职责
2013/11/16 职场文书
中学门卫岗位职责
2013/12/26 职场文书
大学生职业生涯规划书模板
2014/01/03 职场文书
道路施工安全责任书
2014/07/24 职场文书
后勤工作个人总结
2015/02/28 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
党支部考察意见范文
2015/06/02 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python