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数组中删除元素的实现代码
Jun 22 PHP
探讨php中header的用法详解
Jun 07 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
在PHP中运行Linux命令并启动SSH服务的例子
Jun 12 PHP
php实现的click captcha点击验证码类实例
Sep 23 PHP
WordPress中自定义后台管理界面配色方案的小技巧
Dec 29 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
Sep 22 PHP
Laravel下生成验证码的类
Nov 15 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
Laravel实现ORM带条件搜索分页
Oct 24 PHP
PHP命令行与定时任务
Apr 01 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
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
python开发中module模块用法实例分析
2015/11/12 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
详解重置Django migration的常见方式
2019/02/15 Python
python简单实现AES加密和解密
2019/03/28 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
蛋白质世界:Protein World
2017/11/23 全球购物
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
保护环境建议书400字
2014/05/13 职场文书
垂直极限观后感
2015/06/08 职场文书
护士医德医风心得体会
2016/01/25 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
flex弹性布局详解
2022/03/20 HTML / CSS