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数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
PHP静态文件生成类实例
Nov 29 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php使用sql server验证连接数据库的方法
Dec 25 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
Sep 30 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
Aug 16 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
浅谈PHP array_search 和 in_array 函数效率问题
Oct 15 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
PHP.MVC的模板标签系统(二)
2006/09/05 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
php中实现精确设置session过期时间的方法
2014/07/17 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
php和nginx交互实例讲解
2019/09/24 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
JavaScript实现拖拽网页内元素的方法
2015/04/15 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
JS操作字符串转数字的常见方法示例
2019/10/29 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
django中media媒体路径设置的步骤
2019/11/15 Python
Django日志及中间件模块应用案例
2020/09/10 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
Python扫描端口的实现
2021/01/25 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
国际领先的学术出版商:Springer
2017/01/11 全球购物
朗仕(Lab series)英国官网:雅诗兰黛集团男士专属护肤品牌
2017/11/28 全球购物
数据库面试要点基本概念
2013/10/31 面试题
初中班级口号
2014/06/09 职场文书