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脚本的10个技巧(8)
Oct 09 PHP
一步一步学习PHP(3) php 函数
Feb 15 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php自定义urlencode,urldecode函数实例
Mar 24 PHP
PHP常用的小程序代码段
Nov 14 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
php操作xml并将其插入数据库的实现方法
Sep 08 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP通过GD库实现验证码功能示例
Feb 23 PHP
PHP后门隐藏的一些技巧总结
Nov 04 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
YII使用url组件美化管理的方法
2015/12/28 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
Ionic快速安装教程
2016/06/03 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
Node.js的特点详解
2017/02/03 Javascript
jQuery按需加载轮播图(web前端性能优化)
2017/02/17 Javascript
javascript 网页进度条简单实例
2017/02/22 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
python3爬虫怎样构建请求header
2018/12/23 Python
python实现复制大量文件功能
2019/08/31 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
Python API len函数操作过程解析
2020/03/05 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
mysql有关权限的表都有哪几个
2015/04/22 面试题
文秘大学生求职信
2014/02/25 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
司机岗位职责范本
2015/04/10 职场文书
小学教研工作总结2015
2015/05/13 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书