php二叉树算法
<?php
/** * 二叉树的定义 */
class BinaryTree {
protected $key = NULL; // 当前节点的值
protected $left = NULL; // 左子树
protected $right = NULL; // 右子树
/** * 以指定的值构造二叉树,并指定左右子树 *
* @param mixed $key 节点的值.
* @param mixed $left 左子树节点.
* @param mixed $right 右子树节点.
*/
public function __construct( $key = NULL, $left = NULL, $right = NULL) {
$this->key = $key;
if ($key === NULL) {
$this->left = NULL;
$this->right = NULL;
}
elseif ($left === NULL) {
$this->left = new BinaryTree();
$this->right = new BinaryTree();
}
else {
$this->left = $left;
$this->right = $right;
}
}
/**
* 析构方法.
*/
public function __destruct() {
$this->key = NULL;
$this->left = NULL;
$this->right = NULL;
}
/**
* 清空二叉树.
**/
public function purge () {
$this->key = NULL;
$this->left = NULL;
$this->right = NULL;
}
/**
* 测试当前节点是否是叶节点.
*
* @return boolean 如果节点非空并且有两个空的子树时为真,否则为假.
*/
public function isLeaf() {
return !$this->isEmpty() &&
$this->left->isEmpty() &&
$this->right->isEmpty();
}
/**
* 测试节点是否为空
*
* @return boolean 如果节点为空返回真,否则为假.
*/
public function isEmpty() {
return $this->key === NULL;
}
/**
* Key getter.
*
* @return mixed 节点的值.
*/
public function getKey() {
if ($this->isEmpty()) {
return false;
}
return $this->key;
}
/**
* 给节点指定Key值,节点必须为空
*
* @param mixed $object 添加的Key值.
*/
public function attachKey($obj) {
if (!$this->isEmpty())
return false;
$this->key = $obj;
$this->left = new BinaryTree();
$this->right = new BinaryTree();
}
/**
* 删除key值,使得节点为空.
*/
public function detachKey() {
if (!$this->isLeaf())
return false;
$result = $this->key;
$this->key = NULL;
$this->left = NULL;
$this->right = NULL;
return $result;
}
/**
* 返回左子树
*
* @return object BinaryTree 当前节点的左子树.
*/
public function getLeft() {
if ($this->isEmpty())
return false;
return $this->left;
}
/**
* 给当前结点添加左子树
*
* @param object BinaryTree $t 给当前节点添加的子树.
*/
public function attachLeft(BinaryTree $t) {
if ($this->isEmpty() || !$this->left->isEmpty())
return false;
$this->left = $t;
}
/**
* 删除左子树
*
* @return object BinaryTree 返回删除的左子树.
*/
public function detachLeft() {
if ($this->isEmpty())
return false;
$result = $this->left;
$this->left = new BinaryTree();
return $result;
}
/**
* 返回当前节点的右子树
*
* @return object BinaryTree 当前节点的右子树.
*/
public function getRight() {
if ($this->isEmpty())
return false;
return $this->right;
}
/**
* 给当前节点添加右子树
*
* @param object BinaryTree $t 需要添加的右子树.
*/
public function attachRight(BinaryTree $t) {
if ($this->isEmpty() || !$this->right->isEmpty())
return false;
$this->right = $t;
}
/**
* 删除右子树,并返回此右子树
* @return object BinaryTree 删除的右子树.
*/
public function detachRight() {
if ($this->isEmpty ())
return false;
$result = $this->right;
$this->right = new BinaryTree();
return $result;
}
/**
* 先序遍历
*/
public function preorderTraversal() {
if ($this->isEmpty()) {
return ;
}
echo ' ', $this->getKey();
$this->getLeft()->preorderTraversal();
$this->getRight()->preorderTraversal();
}
/**
* 中序遍历
*/
public function inorderTraversal() {
if ($this->isEmpty()) {
return ;
}
$this->getLeft()->preorderTraversal();
echo ' ', $this->getKey();
$this->getRight()->preorderTraversal();
}
/**
* 后序遍历
*/
public function postorderTraversal() {
if ($this->isEmpty()) {
return ;
}
$this->getLeft()->preorderTraversal();
$this->getRight()->preorderTraversal();
echo ' ', $this->getKey();
}
}
/**
* 二叉排序树的PHP实现
*/
class BST extends BinaryTree {
/**
* 构造空的二叉排序树
*/
public function __construct() {
parent::__construct(NULL, NULL, NULL);
}
/**
* 析构
*/
public function __destruct() {
parent::__destruct();
}
/**
* 测试二叉排序树中是否包含参数所指定的值
*
* @param mixed $obj 查找的值.
* @return boolean True 如果存在于二叉排序树中则返回真,否则为假期
*/
public function contains($obj) {
if ($this->isEmpty())
return false;
$diff = $this->compare($obj);
if ($diff == 0) {
return true;
}elseif ($diff < 0) return $this->getLeft()->contains($obj);
else
return $this->getRight()->contains($obj);
}
/**
* 查找二叉排序树中参数所指定的值的位置
*
* @param mixed $obj 查找的值.
* @return boolean True 如果存在则返回包含此值的对象,否则为NULL
*/
public function find($obj) {
if ($this->isEmpty())
return NULL;
$diff = $this->compare($obj);
if ($diff == 0)
return $this->getKey();
elseif ($diff < 0) return $this->getLeft()->find($obj);
else
return $this->getRight()->find($obj);
}
/**
* 返回二叉排序树中的最小值
* @return mixed 如果存在则返回最小值,否则返回NULL
*/
public function findMin() {
if ($this->isEmpty ())
return NULL;
elseif ($this->getLeft()->isEmpty())
return $this->getKey();
else
return $this->getLeft()->findMin();
}
/**
* 返回二叉排序树中的最大值
* @return mixed 如果存在则返回最大值,否则返回NULL
*/
public function findMax() {
if ($this->isEmpty ())
return NULL;
elseif ($this->getRight()->isEmpty())
return $this->getKey();
else
return $this->getRight()->findMax();
}
/**
* 给二叉排序树插入指定值
*
* @param mixed $obj 需要插入的值.
* 如果指定的值在树中存在,则返回错误
*/
public function insert($obj) {
if ($this->isEmpty()) {
$this->attachKey($obj);
} else {
$diff = $this->compare($obj);
if ($diff == 0)
die('argu error');
if ($diff < 0) $this->getLeft()->insert($obj);
else
$this->getRight()->insert($obj);
}
$this->balance();
}
/**
* 从二叉排序树中删除指定的值
*
* @param mixed $obj 需要删除的值.
*/
public function delete($obj) {
if ($this->isEmpty ())
die();
$diff = $this->compare($obj);
if ($diff == 0) {
if (!$this->getLeft()->isEmpty()) {
$max = $this->getLeft()->findMax();
$this->key = $max;
$this->getLeft()->delete($max);
}
elseif (!$this->getRight()->isEmpty()) {
$min = $this->getRight()->findMin();
$this->key = $min;
$this->getRight()->delete($min);
} else
$this->detachKey();
} else if ($diff < 0) $this->getLeft()->delete($obj);
else
$this->getRight()->delete($obj);
$this->balance();
}
public function compare($obj) {
return $obj - $this->getKey();
}
/**
* Attaches the specified object as the key of this node.
* The node must be initially empty.
*
* @param object IObject $obj The key to attach.
* @exception IllegalOperationException If this node is not empty.
*/
public function attachKey($obj) {
if (!$this->isEmpty())
return false;
$this->key = $obj;
$this->left = new BST();
$this->right = new BST();
}
/**
* Balances this node.
* Does nothing in this class.
*/
protected function balance () {}
/**
* Main program.
*
* @param array $args Command-line arguments.
* @return integer Zero on success; non-zero on failure.
*/
public static function main($args) {
printf("BinarySearchTree main program.\n");
$root = new BST();
foreach ($args as $row) {
$root->insert($row);
}
return $root;
}
}
$root = BST::main(array(50, 3, 10, 5, 100, 56, 78));
echo $root->findMax();
$root->delete(100);
echo $root->findMax();
php二叉树算法的更多相关文章
- JavaScript实现二叉树算法
二叉树的遍历方式 分别为中序遍历(左子树->当前节点->右子树).前序遍历(当前节点->左子树->右子树).后序遍历(左子树->右子树->当前节点).下面使用Jav ...
- JS数据结构与算法 - 剑指offer二叉树算法题汇总
❗❗ 必看经验 在博主刷题期间,基本上是碰到一道二叉树就不会碰到一道就不会,有时候一个下午都在搞一道题,看别人解题思路就算能看懂,自己写就呵呵了.一气之下不刷了,改而先去把二叉树的基础算法给搞搞懂,然 ...
- JS - 二叉树算法实现与遍历 (更新中...)
一.关于二叉树: 截图来自:https://segmentfault.com/a/1190000000740261 温馨提示:学习以及使用二叉树概念,心中永远有这么一个图,对于理解和接受二叉树有很大的 ...
- js 二叉树算法
//生成二叉树 function binarySearchTree() { let Node = function(key) { this.key = key; this.left = null; t ...
- Javascritp 数据结构和二叉树算法
1,所有圆圈都是一个节点,里面的数字就是节点的值.8上面没有父节点,那么8就是根节点,而4,7,13没有子节点了,称之为叶子结点.其他的称之为:中间结点. 2,8节点是3和10的父节点,3是8的左孩子 ...
- 面试常见二叉树算法题集锦-Java实现
1.求二叉树的深度或者说最大深度 /* ***1.求二叉树的深度或者说最大深度 */ public static int maxDepth(TreeNode root){ if(root==null) ...
- C#使用二叉树算法设计一个无限分级的树表
效果图: 数据库: 操作树的示意图: 控制器代码: using Dw.Business; using Dw.Entity; using Dw.Utilities; using System; usin ...
- java版二叉树算法实现
import java.util.ArrayList; class BinaryTree { private static class TreeNode { int data; TreeNode le ...
- [二叉树算法]关于判断是否为BST的算法
//判断是否为BST 搜索树==二叉排序树 1.递归知最大最小值.2.先中序判是否单调 bool IsValidBST(BTNode *p,int low,int high){ if(p==NULL) ...
随机推荐
- 理解matplotlib绘图
matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包.Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件.它能让使用者很轻松地将数据图形化 ...
- 一起学CUDA(一)
前提是电脑的显卡支持CUDA,N卡一般是支持的,如果是A卡就没办法了.主要针对Windows环境,Linux和Mac也有相应的安装包.CUDA环境搭建:Step1:安装代码环境VS2010:Step2 ...
- Linux/Unix shell sql 之间传递变量
灵活结合Linux/Unix Shell 与SQL 之间的变量传输,极大程度的提高了DBA的工作效率,本文针对Linux/Unix shell sql 之间传递变量给出几个简单的示例以供参考. Lin ...
- git常用知识整理
分布式和集中版本控制的区别 分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:1.资源准备
最近,在VmwareStation 10虚拟机上,基于CentOS5.4安装Oracle 11g RAC,并把过程记录下来.刚开始时,是基于CentOS 6.4安装Oracle 11g RAC, 没有 ...
- Apache加载PHP.ini顺序
网上找到一份关于Apache加载PHP.ini顺序的文档: (1) apache的httpd.conf中的PhpIniDir: (2) 注册表键值:HKEY_LOCAL_MACHINE->SOF ...
- sessionFactory.getCurrentSession()的引出
当业务逻辑中需要开启事务执行,业务逻辑也要调用底层操作数据库的函数,那函数也要开启事务操作. 如果用sessionFactory.openSession()的话会引起处理不在同一个事务中,会造成出错. ...
- Windows 环境搭建cocos2dx 3.x Eclipse的环境
安装JDK,该步骤网上太多,不再赘述; 安装NDK,同样,直接去Google找到最新的NDK,下载解压到某个盘符根目录即可; 简便起见,使用ADT Bundle,而不要去使用Eclipse的原生包,可 ...
- RequiredFieldValidator的使用
特別說明:1.一個Button要對頁面的多個控件進行驗證,則需要設置button和其它受控控件的ValidationGroup屬性 aspx頁面實例: <tr class="h&quo ...
- [转]对Android开发者有益的40条优化建议
下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...