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 相关文章推荐
使用 eAccelerator加速PHP代码的方法
Sep 30 PHP
可以在线执行PHP代码包装修正版
Mar 15 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php错误、异常处理机制(补充)
May 07 PHP
Zend Studio 实用快捷键一览表(精心整理)
Aug 10 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
js代码实现微博导航栏
Jul 30 PHP
php无限分类使用concat如何实现
Nov 05 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
PHP高并发和大流量解决方案整理
Dec 24 PHP
Yii框架小部件(Widgets)用法实例详解
May 15 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 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
php中文本数据翻页(留言本翻页)
2006/10/09 PHP
用PHP实现图象锐化代码
2007/06/14 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
php实现session共享的实例方法
2019/09/19 PHP
php array_map()函数实例用法
2021/03/03 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
js如何实现设计模式中的模板方法
2013/07/23 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
pandas表连接 索引上的合并方法
2018/06/08 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
英语商务邀请函范文
2014/01/16 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
绿色出行口号
2014/06/18 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Python趣味爬虫之用Python实现智慧校园一键评教
2021/05/28 Python