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存储过程的方法
Sep 12 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 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中的array数组类型分析说明
2010/07/27 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
jquery自定义函数的多种方法
2014/01/09 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
node.js中的emitter.emit方法使用说明
2014/12/10 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
Python贪吃蛇游戏编写代码
2020/10/26 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
英国儿童鞋和靴子:Start-Rite
2019/05/06 全球购物
酒吧总经理岗位职责
2013/12/10 职场文书
企业军训感想
2014/02/07 职场文书
出纳员岗位责任制
2014/02/11 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
计生专干事迹
2014/05/28 职场文书
爱牙日活动总结
2014/08/29 职场文书
2014银行领导班子群众路线对照检查材料思想汇报
2014/09/17 职场文书
工地材料员岗位职责
2015/04/11 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
HAM-2000摩机图
2021/04/22 无线电
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
pandas求平均数和中位数的方法实例
2021/08/04 Python
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
微信小程序实现轮播图指示器
2022/06/25 Javascript