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项目的方法
Oct 09 PHP
PHP 和 MySQL 开发的 8 个技巧
Oct 09 PHP
推荐文章系统(一)
Oct 09 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
PHP常用的小程序代码段
Nov 14 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
php连接oracle数据库的核心步骤
May 26 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
PHP使用QR Code生成二维码实例
Jul 07 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
中国收音机工业发展史
2021/03/02 无线电
由php的call_user_func传reference引发的思考
2010/07/23 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
用javascript实现画板的代码
2007/09/05 Javascript
JS trim去空格的最佳实践
2011/10/30 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
2014/12/29 Javascript
javascript基本算法汇总
2016/03/09 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
EsLint入门学习教程
2017/02/17 Javascript
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
koa-router源码学习小结
2018/09/07 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
python实现装饰器、描述符
2018/02/28 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
实习自我鉴定模板
2013/09/28 职场文书
授权委托书格式模板
2014/04/03 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
十八大标语口号
2014/10/09 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏