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) ...
随机推荐
- 在ACCESS中创建数据库和查询(ACCESS 2000)
备份还原数据库 备份.还原 —— 复制\粘贴 压缩修复数据库命令 —— 复制该文件并重新组织,并重新组织文件在磁盘上的储存方式.压缩同时优化了Access数据库的性能.(工具——实用数据库工具或者工具 ...
- HttpWebRequest代理访问网站
private void button1_Click(object sender, EventArgs e) { string str ="http://www.7y8.com/V/ip.a ...
- js COOKIE 记住帐号或者uuid
当开始接到这个任务的时候,我对cookie还是没多少了解的,而uuid的生成也是一无所知.但是当你发现这个网址http://stackoverflow.com/questions/105034/how ...
- [再寄小读者之数学篇](2014-11-19 $\sin(x+y)=\sin x\cos y+\cos x\sin y$)
$$\bex \sin(x+y)=\sin x\cos y+\cos x\sin y. \eex$$ Ref. [Proof Without Words: Sine Sum Identity, The ...
- HashBiMap
HashBiMap AbstractMap类实现了Map接口定义的一些方法,而BiMap类定义了其子类需要实现的一些方法,使得所有实现BiMap的类必须符合其独有的特性:键.值都是唯一的.HashB ...
- android操作文件
Android中读取/写入文件的方法,与Java中的I/O是一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件.但是在默认状态下,文件是不能在不同的程 ...
- Linux基本命令(10)其他命令
其他命令 命令 功能 命令 功能 echo 显示一字串 passwd 修改密码 clear 清除显示器 lpr 打印 lpq 查看在打印队列中等待的作业 lprm 取消打印队列中的作业 10.1 ec ...
- Python在centos下的安装
1.wget http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz默认下载到主目录下 2.tar xzf Python-2.6.6.tgz 3 ...
- 算法:最大子数组own
转载标明出处:http://i.cnblogs.com/EditPosts.aspx?postid=4726782&update=1 暴力法: // maxValue.cpp : 定义控制台应 ...
- 封装cookie.js、EventUtil.js、
最近学习了javascript,封装好的东西看起来舒服,以备需要的时候拉出来,jquery对javascript做了很好的封装!以后会多用jquery多些 var CookieUtil = { get ...