PHP Class&Object -- 解析PHP实现二叉树


Posted in PHP onJune 25, 2013

二叉树及其变体是数据结构家族里的重要组成部分。最为链表的一种变体,二叉树最适合处理需要一特定次序快速组织和检索的数据。

<?php
// Define a class to implement a binary tree
class Binary_Tree_Node {
    // Define the variable to hold our data:
    public $data;
    // And a variable to hold the left and right objects:
    public $left;
    public $right;    // A constructor method that allows for data to be passed in
    public function __construct($d = NULL) {
        $this->data = $d;
    }
    // Traverse the tree, left to right, in pre-order, returning an array
    // Preorder means that each node's value preceeds its children.
    public function traversePreorder() {
        // Prep some variables.
        $l = array();
        $r = array();
        // Read in the left and right children appropriately traversed:
        if ($this->left) { $l = $this->left->traversePreorder(); }
        if ($this->right) { $r = $this->right->traversePreorder(); }
        // Return a merged array of the current value, left, and right:
        return array_merge(array($this->data), $l, $r); 
    }
    // Traverse the tree, left to right, in postorder, returning an array
    // Postorder means that each node's value follows its children.
    public function traversePostorder() {
        // Prep some variables.
        $l = array();
        $r = array();
        // Read in the left and right children appropriately traversed:
        if ($this->left) { $l = $this->left->traversePostorder(); }
        if ($this->right) { $r = $this->right->traversePostorder(); }
        // Return a merged array of the current value, left, and right:
        return array_merge($l, $r, array($this->data)); 
    }
    // Traverse the tree, left to right, in-order, returning an array.
    // In-order means that values are ordered as left children, then the
    //  node value, then the right children.
    public function traverseInorder() {
        // Prep some variables.
        $l = array();
        $r = array();
        // Read in the left and right children appropriately traversed:
        if ($this->left) { $l = $this->left->traverseInorder(); }
        if ($this->right) { $r = $this->right->traverseInorder(); }
        // Return a merged array of the current value, left, and right:
        return array_merge($l, array($this->data), $r); 
    }
}
// Let's create a binary tree that will equal the following:    3
//                                                             / /      
//                                                            h   9      
//                                                               / /     
// Create the tree:                                             6   a    
$tree = new Binary_Tree_Node(3);
$tree->left = new Binary_Tree_Node('h');
$tree->right = new Binary_Tree_Node(9);
$tree->right->left = new Binary_Tree_Node(6);
$tree->right->right = new Binary_Tree_Node('a');
// Now traverse this tree in all possible orders and display the results:
// Pre-order: 3, h, 9, 6, a
echo '<p>', implode(', ', $tree->traversePreorder()), '</p>';
// Post-order: h, 9, 6, a, 3
echo '<p>', implode(', ', $tree->traversePostorder()), '</p>';
// In-order: h, 3, 6, 9, a
echo '<p>', implode(', ', $tree->traverseInorder()), '</p>';
?>

PHP 相关文章推荐
如何在PHP中使用Oracle数据库(6)
Oct 09 PHP
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
pw的一个放后门的方法分析
Oct 08 PHP
php 正则匹配函数体
Aug 25 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
thinkphp特殊标签用法概述
Nov 24 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
Apr 26 PHP
php分页查询mysql结果的base64处理方法示例
May 18 PHP
Laravel 批量更新多条数据的示例
Nov 27 PHP
PHP实现git部署的方法教程
Dec 19 PHP
PHP Class&amp;Object -- PHP 自排序二叉树的深入解析
Jun 25 #PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 #PHP
PHP多例模式介绍
Jun 24 #PHP
PHP获取和操作配置文件php.ini的几个函数介绍
Jun 24 #PHP
PHP垃圾回收机制引用计数器概念分析
Jun 24 #PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 #PHP
PHP 读取大文件的X行到Y行内容的实现代码
Jun 24 #PHP
You might like
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
php preg_filter执行一个正则表达式搜索和替换
2012/02/27 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
2014/05/11 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
在Echarts图中给坐标轴加一个标识线markLine
2020/07/20 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
Python中正则表达式详解
2017/05/17 Python
python队列通信:rabbitMQ的使用(实例讲解)
2017/12/22 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
党章学习思想汇报
2014/01/14 职场文书
入党推优材料
2014/06/02 职场文书
公司员工离职证明书
2014/10/04 职场文书
陪护人员误工证明
2015/06/24 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript