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 和 MySQL 开发的 8 个技巧
Jan 02 PHP
PHP学习之整理字符串
Apr 17 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
php三维数组去重(示例代码)
Nov 26 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
PHP获取用户访问IP地址的5种方法
May 16 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP实现的简单排列组合算法应用示例
Jun 20 PHP
PHP环形链表实现方法示例
Sep 15 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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 base64编码后解码乱码的解决办法
2014/06/19 PHP
PHP中实现crontab代码分享
2015/03/26 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
Python多线程编程简单介绍
2015/04/13 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
支持IE8的纯css3开发的响应式设计动画菜单教程
2014/11/05 HTML / CSS
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
儿子婚宴答谢词
2014/01/09 职场文书
大学生校园创业计划书
2014/02/08 职场文书
目标责任书范文
2014/04/14 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
护士实习求职信
2014/06/22 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
maven依赖的version声明控制方式
2022/01/18 Java/Android