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编程--二叉树遍历算法实现的更多相关文章
- python实现二叉树遍历算法
说起二叉树的遍历,大学里讲的是递归算法,大多数人首先想到也是递归算法.但作为一个有理想有追求的程序员.也应该学学非递归算法实现二叉树遍历.二叉树的非递归算法需要用到辅助栈,算法着实巧妙,令人脑洞大开. ...
- 树和二叉树->遍历
文字描述 二叉树的先根遍历 若二叉树为空,则空操纵,否则 (1) 访问根结点 (2) 先根遍历左子树 (3) 先根遍历右子树 二叉树的中根遍历 若二叉树为空,则空操纵,否则 (1) 中根遍历左子树 ( ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
- javascript数据结构与算法--二叉树遍历(后序)
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
- javascript数据结构与算法--二叉树遍历(先序)
javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- javascript数据结构与算法--二叉树遍历(中序)
javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...
- 算法随笔-二叉树遍历的N种姿势
最近在练习用Python刷算法,leetcode上刷了快300题.一开始怀疑自己根本不会写代码,现在觉得会写一点点了,痛苦又充实的刷题历程.对我这种半路出家的人而言,收获真的很大. 今天就从二叉树遍历 ...
- 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法
PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...
- Python -二叉树 创建与遍历算法(很详细)
树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...
随机推荐
- P5108 仰望半月的夜空
题目链接 题意分析 给你一个字符串 让你求\(1-n\)长度下的字符串的中字典序最小并且最靠左的字符串的开头位置 我们考虑先建出\(SA\) 然后考虑对于一个字符串后缀排序之后 baba 后缀排序之后 ...
- Hibernate 使用log4j日志记录
日志记录使程序员能够将日志详细信息永久写入文件.这是我们以后在开发当中非常重要的一步. Hibernate使用log4j日志记录,我们需要以下几个步骤: 1.导入jar包: (1)这是hibernat ...
- Smarty带来的神秘的数字1
问题的引发:在htmly页面通过smarty模板引擎开启session_start()后,突发发现页面无故多了一个 神秘的数字 1 问题界面: 代码: 测试:在session_start()行末加2 ...
- 大数据平台-修改主机名及ssh免密码登录
一.查看服务器初始配置: 1.总核数 = 物理CPU个数 X 每颗物理CPU的核数 2.总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat /pr ...
- Rx
more detailed in WIKI's document SDP :session description protocal book AAA AA-Answer 鉴权授权应答AAR AA-R ...
- PIE SDK Command&&Tool工具命令一览表
PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...
- linux 搭建gitlab server
以root 身份进行登录linux 1.先安装相关依赖: sudo yum install -y curl policycoreutils-python openssh-server 2.开启SSH开 ...
- 详解exif.js,应用于canvas照片倒转(海报H5)
业务背景,苹果手机调用上传接口拍照没有问题但是上传到网页上照片倒转了解决方法利用exif.js读取图片参数并对图片进行元数据修改 window.btoa(str)转码 window.atob(base ...
- oracle--错误笔记(一)
一,环境模拟 SQL> select status from v$instance; STATUS ------------ OPEN SQL> select * from v$backu ...
- 解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题 && 一般的浏览器input和button的高度不一致问题
解决chrome浏览器对于自动填充的input表单添加的默认的淡黄色背景问题 如果我们把一个表单设置位 autofocus ,这时这个表单在获取焦点后就会产生淡黄色的背景,我们就是使用!importa ...