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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
PHP实现用户认证及管理完全源码
Mar 11 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
php header Content-Type类型小结
Jul 03 PHP
php入门学习知识点三 PHP上传
Jul 14 PHP
php foreach正序倒序输出示例代码
Jul 01 PHP
php获取url参数方法总结
Nov 13 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 PHP
php实现微信扫码支付
Mar 26 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 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/03 新手入门
php cli 小技巧
2013/06/03 PHP
php动态变量定义及使用
2015/06/10 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
jQuery toggle()设置CSS样式
2009/11/05 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Python3 利用face_recognition实现人脸识别的方法
2020/03/13 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
空指针到底是什么
2012/08/07 面试题
党员自评材料范文
2014/12/17 职场文书
检讨书格式
2015/01/23 职场文书
教师求职自荐信范文
2015/03/04 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js