今天使用php来实现二叉树的遍历

创建的二叉树如下图所示

php代码如下所示:

  1.  
    <?php
  2.  
    class Node {
  3.  
    public $value;
  4.  
    public $child_left;
  5.  
    public $child_right;
  6.  
    }
  7.  
    final class Ergodic {
  8.  
    //前序遍历:先访问根节点,再遍历左子树,最后遍历右子树;并且在遍历左右子树时,仍需先遍历根节点,然后访问左子树,最后遍历右子树
  9.  
    public static function preOrder($root){
  10.  
    $stack = array();
  11.  
    array_push($stack, $root);
  12.  
    while(!empty($stack)){
  13.  
    $center_node = array_pop($stack);
  14.  
    echo $center_node->value . ' ';
  15.  
     
  16.  
    //先把右子树节点入栈,以确保左子树节点先出栈
  17.  
    if($center_node->child_right != null) array_push($stack, $center_node->child_right);
  18.  
    if($center_node->child_left != null) array_push($stack, $center_node->child_left);
  19.  
    }
  20.  
    }
  21.  
    //中序遍历:先遍历左子树、然后访问根节点,最后遍历右子树;并且在遍历左右子树的时候。仍然是先遍历左子树,然后访问根节点,最后遍历右子树
  22.  
    public static function midOrder($root){
  23.  
    $stack = array();
  24.  
    $center_node = $root;
  25.  
    while (!empty($stack) || $center_node != null) {
  26.  
    while ($center_node != null) {
  27.  
    array_push($stack, $center_node);
  28.  
    $center_node = $center_node->child_left;
  29.  
    }
  30.  
     
  31.  
    $center_node = array_pop($stack);
  32.  
    echo $center_node->value . ' ';
  33.  
     
  34.  
    $center_node = $center_node->child_right;
  35.  
    }
  36.  
    }
  37.  
    //后序遍历:先遍历左子树,然后遍历右子树,最后访问根节点;同样,在遍历左右子树的时候同样要先遍历左子树,然后遍历右子树,最后访问根节点
  38.  
    public static function endOrder($root){
  39.  
    $push_stack = array();
  40.  
    $visit_stack = array();
  41.  
    array_push($push_stack, $root);
  42.  
     
  43.  
    while (!empty($push_stack)) {
  44.  
    $center_node = array_pop($push_stack);
  45.  
    array_push($visit_stack, $center_node);
  46.  
    //左子树节点先入$pushstack的栈,确保在$visitstack中先出栈
  47.  
    if ($center_node->child_left != null) array_push($push_stack, $center_node->child_left);
  48.  
    if ($center_node->child_right != null) array_push($push_stack, $center_node->child_right);
  49.  
    }
  50.  
     
  51.  
    while (!empty($visit_stack)) {
  52.  
    $center_node = array_pop($visit_stack);
  53.  
    echo $center_node->value . ' ';
  54.  
    }
  55.  
    }
  56.  
    }
  57.  
     
  58.  
     
  59.  
    //创建二叉树
  60.  
    $a = new Node();
  61.  
    $b = new Node();
  62.  
    $c = new Node();
  63.  
    $d = new Node();
  64.  
    $e = new Node();
  65.  
    $f = new Node();
  66.  
    $g = new Node();
  67.  
    $h = new Node();
  68.  
    $i = new Node();
  69.  
     
  70.  
    $a->value = 'A';
  71.  
    $b->value = 'B';
  72.  
    $c->value = 'C';
  73.  
    $d->value = 'D';
  74.  
    $e->value = 'E';
  75.  
    $f->value = 'F';
  76.  
    $g->value = 'G';
  77.  
    $h->value = 'H';
  78.  
    $i->value = 'I';
  79.  
     
  80.  
    $a->child_left = $b;
  81.  
    $a->child_right = $c;
  82.  
    $b->child_left = $d;
  83.  
    $b->child_right = $g;
  84.  
    $c->child_left = $e;
  85.  
    $c->child_right = $f;
  86.  
    $d->child_left = $h;
  87.  
    $d->child_right = $i;
  88.  
     
  89.  
     
  90.  
    //前序遍历
  91.  
    Ergodic::preOrder($a); //结果是:A B D H I G C E F
  92.  
    echo '<br/>';
  93.  
    //中序遍历
  94.  
    Ergodic::midOrder($a); //结果是: H D I B G A E C F
  95.  
    echo '<br/>';
  96.  
    //后序遍历
  97.  
    Ergodic::endOrder($a); //结果是: H I D G B E F C A

php编程--二叉树遍历算法实现的更多相关文章

  1. python实现二叉树遍历算法

    说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...

  2. 树和二叉树->遍历

    文字描述 二叉树的先根遍历 若二叉树为空,则空操纵,否则 (1) 访问根结点 (2) 先根遍历左子树 (3) 先根遍历右子树 二叉树的中根遍历 若二叉树为空,则空操纵,否则 (1) 中根遍历左子树 ( ...

  3. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  4. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

  5. javascript数据结构与算法--二叉树遍历(先序)

    javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  6. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  7. 算法随笔-二叉树遍历的N种姿势

    最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...

  8. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  9. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

随机推荐

  1. flask实战-个人博客-使用类组织配置

    使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...

  2. 1. JavaScript学习笔记——JS基础

    1. JavaScript基础 1.1 语法 严格区分大小写 标识符,第一个字符可以是 $,建议使用小驼峰法, 保留字.关键字.true.false.null不能作为标识符 JavaScript是用U ...

  3. Flutter Map<String, dynamic> 、List<String> a-z 排序

    字符串从 a-z 排序. Map<String, String> map = XXX, List<String> keys = map.keys.toList(); // ke ...

  4. python logging模块的使用

    logging 专门用于记录日志的模块,相对于print来说,logging 提供了日志信息的分级.格式化.过滤等功能.在程序中定义丰富有条理的log信息,可以方便分析程序的运行状态,在发生问题是可有 ...

  5. Sql数据库收缩 语句特别快

    数据库在收缩的时候..使用菜单 >> 任务 >> 收缩 >> 文件 >> 数据,  特别慢..还会报错失败.. 但使用脚本 USE [dbName] G ...

  6. HTML5获取地理经纬度并通过百度接口得到实时位置

    注:用的时候将获取北京位置那放到获取经度纬度后面即可 -----------实际用的时候的代码如下:start  -------- var myCity;getLocation()function g ...

  7. (转)搭建企业内部yum仓库(centos6+centos7+epel源)

    搭建企业内部yum仓库(centos6+centos7+epel源) 原文:https://www.cnblogs.com/nulige/p/6081192.html https://www.linu ...

  8. Java学习之路(二):Java中的方法

    Java中的方法 概念: 为什么要有方法: 提高代码的复用性 什么是方法: 完成特定功能的代码块 格式: 修饰符 返回值类型 方法名(参数){ 方法体语句: return 返回值: } 1.修饰符:例 ...

  9. idea maven install 卡住,无报错排查。

    今天使用idea打包,执行install,看控制台日志,卡主了(意思是日志不继续在控制台输打印了,卡主了,也看不到错误),也没有报错,然后进行排查. 进入dos命令,进入到项目的根目录,使用 运行 m ...

  10. ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现

    本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...