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邮件类
Jan 03 PHP
PHP 强制下载文件代码
Oct 24 PHP
fleaphp rolesNameField bug解决方法
Apr 23 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
Jun 28 PHP
php使用qr生成二维码的示例分享
Jan 20 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP基于Redis消息队列实现发布微博的方法
May 03 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
PHP中用Trait封装单例模式的实现
Dec 18 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
基于laravel Request的所有方法详解
2019/09/29 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
js实现jquery的offset()方法实例
2015/01/10 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
2015/11/13 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
Python中的字符串类型基本知识学习教程
2016/02/04 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python中turtle库的使用实例
2019/09/09 Python
物业管理求职自荐信
2013/09/25 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
对标管理实施方案
2014/03/12 职场文书
党的群众路线教育实践活动动员会主持词
2014/03/20 职场文书
田径运动会通讯稿
2014/09/13 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers