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 相关文章推荐
福利彩票幸运号码自动生成器
Oct 09 PHP
PHP4与PHP5的时间格式问题
Feb 17 PHP
php二维数组排序方法(array_multisort usort)
Dec 25 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
May 05 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 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
zf框架db类的分页示例分享
2014/03/14 PHP
PHP实现的简单日历类
2014/11/29 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
jQuery阻止同类型事件小结
2013/04/19 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
JavaScript实现列出数组中最长的连续数
2014/12/29 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
jQuery弹出窗口简单实现代码
2017/03/09 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
Python中暂存上传图片的方法
2015/02/18 Python
Python中super()函数简介及用法分享
2016/07/11 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
Python shelve模块实现解析
2019/08/28 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
Python pip使用超时问题解决方案
2020/08/03 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
父亲八十大寿答谢词
2014/01/23 职场文书
地质灾害防治方案
2014/05/14 职场文书
会计工作能力自我评价
2015/03/05 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
python面向对象版学生信息管理系统
2021/06/24 Python
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL