<?php
require 'bstorder.php';
$test = range(1, 10);
//$test = array(3,9,1,4,8,5,7,6,2,10);
$tree = new bst($test, true);
//$tree->deletenode('30');(非平衡树可删除,平衡树的没写删除操作)
print_r($tree->gettree());
?>
bstorder.php
<?php
/**
* php实现二叉排序树
* @author zhaojiangwei
* @since 2011/11/16 16:29
*
*/
class node{
private $data;
private $left;
private $right;
private $bf;//平衡度
public function node($data = null, $bf = 0, $left = null, $right = null){
$this->data = $data;
$this->left = $left;
$this->right = $right;
$this->bf = $bf;
}
public function getbf(){
return $this->bf;
}
public function setbf($bf){
$this->bf = $bf;
}
public function getdata(){
return $this->data;
}
public function setdata($data){
$this->data = $data;
}
public function &getleft(){
return $this->left;
}
public function &getright(){
return $this->right;
}
public function setleft($left){
$this->left = $left;
}
public function setright($right){
$this->right = $right;
}
}
class bst{
private $head;//头结点
private $data;//初始输入的数据,为数组形式,如array('a','b');
private $tag;//查找时设置的前一结点(已无效,没用)
//$bst:是否创建avl树
public function bst($data, $bst = false){
$this->data = $data;
$this->head = null;
if(!$bst){
$this->createbst();
}else{
$this->createbfbst();
}
}
public function createbfbst(){
foreach($this->data as $value){
$this->insertbfnode($this->head, $value);
}
}
private function insertbfnode(&$node, $value){
if($node == null){
$node = new node($value, 0);
return true;
}else{
if($node->getdata() > $value){
if(!$this->insertbfnode($node->getleft(), $value)){
return false;
}
switch($node->getbf()){
case 0:
$node->setbf(1);
return true;
case 1:
$this->rightrotate($node);
return false;
case -1:
$node->setbf(0);
return false;
}
}elseif($node->getdata() < $value){
if(!$this->insertbfnode($node->getright(), $value)){
return false;
}
switch($node->getbf()){
case 0:
$node->setbf(-1);
return true;
case 1:
$node->setbf(0);
return false;
case -1:
$this->leftrotate($node);
return false;
}
}else{
return false;
}
}
}
private function excuteleft(&$node){
$temp = $node;
$node = $node->getright();
$temp->setright($node->getleft());
$node->setleft($temp);
}
private function excuteright(&$node){
$temp = $node;
$node = $node->getleft();
$temp->setleft($node->getright());
$node->setright($temp);
}
private function leftrotate(&$node){
$right = &$node->getright();
switch($right->getbf()){
case 1:
$left = &$right->getleft();
switch($left->getbf()){
case -1:
$right->setbf(0);
$node->setbf(1);
break;
case 0:
$right->setbf(0);
$node->setbf(0);
break;
case 1:
$right->setbf(-1);
$node->setbf(0);
break;
}
$left->setbf(0);
$this->excuteright($right);
$this->excuteleft($node);
break;
case -1:
$node->setbf(0);
$right->setbf(0);
$this->excuteleft($node);
break;
}
}
private function rightrotate(&$node){
$left = &$node->getleft();
switch($left->getbf()){
case -1:
$right = &$left->getright();
switch($right->getbf()){
case -1:
$left->setbf(1);
$node->setbf(0);
break;
case 0:
$left->setbf(0);
$node->setbf(0); 本文链接http://www.cxybl.com/html/wlbc/Php/20120607/28509.html
平衡二叉树:php实现平衡二叉树(avl树)
时间: 2024-10-05 10:32:52
平衡二叉树:php实现平衡二叉树(avl树)的相关文章
二叉树学习笔记之经典平衡二叉树(AVL树)
二叉查找树(BSTree)中进行查找.插入和删除操作的时间复杂度都是O(h),其中h为树的高度.BST的高度直接影响到操作实现的性能,最坏情况下,二叉查找树会退化成一个单链表,比如插入的节点序列本身就有序,这时候性能会下降到O(n).可见在树的规模固定的前提下,BST的高度越低越好. 平衡二叉树 平衡二叉树是计算机科学中的一类改进的二叉查找树. 平衡二叉树具有以下性质: (1)一棵空树是平衡二叉树 (2)如果树不为空,它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.
AVL树的研究
3 实现算法 3.1 数据结构 template<typename T>struct BSTNode//平衡二叉树的结点类型结构体 { T data;//结点数据类型 int bf;//结点的平衡因子,比二叉链表结点多此项 BSTNode<T>*lchild,*rchild;//左右孩子指针 }; 3.2 算法 3.2.1 递归法 递归实现AVL树的节点删除的思想如下. 在AVL树T上删除值为E的节点步骤如下: (1)
AVL树删除算法的实现--长安大学毕业设计
AVL树的删除算法的两种实现方法 本文是本人原创,当时作为长安大学高一凡老师带的学生,我的毕业设计就是做一个AVL 算法的演示软件.其中,AVL树的删除算法在度娘和 谷歌了很久都没有找到逻辑通畅或者说是我能够看懂的.后来,闭门造成,费了十几张A4纸才把算法设计出来.实现之后得到了老师的认同.非常的开心.之前我骗了大家,用网络上能搜到的算法来敷衍大家,一直觉得我的努力成果,不能让别人剽窃.但是,这么多年过去了.我觉得,我要和CSDN上其他码农一样,需要具有分享精神.... 本文是当时我想投稿的一个
数据结构之AVL树详解_C 语言
1. 概述 AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis.AVL树种查找.插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树.本文介绍了AVL树的设计思想和基本操作. 2. 基本术语 有四种种情况可能导致二叉查找树不平衡,分别为: (1)LL:插入一个新节点到根节点的左子树(Left)的左子树
AVL树
平衡二叉树,是一个方便查找的树,树的左子树深度与右子树的深度的差总(BF)是在+1,0,-1之中. 随着树的建立,插入,树都会自动的进行调整,使得其满足上面的条件. 1.+1表示左子树的深度比右子树的深度多1. 2.0 表示左子树的深度与右子树的深度相同. 3.-1表示左子树的深度比右子树神的小1. 因此,如果一个数据插入到情况1中,也就是说,数据插入到左子树中,左子树的深度将会比右子树多2.此时,需要调整树的结构.如果插入尾端节点的左子树中,则这个尾端节点相应的BF值,就变成+1.相反,如果插
AVL树的实现代码
本文配套源码 /******************************************************************** created: 2007/08/28 filename: avltree.c author: Lichuang purpose: AVL树的实现代码, 参考资料<<数据结构与算法分析-C语言描述>>, 作者Allen Weiss **************************************************
AVL树的删除探讨
AVL树的删除很多教材上都没有提供,本人对AVL树有着较为深入的研究.现在晒出大体的算法思想. 3.2.1 递归法 递归实现AVL树的结点删除的思想如下. 在AVL树T上删除值为E的结点步骤如下: (1) 若树T为空,返回0退出否则到(2); (2) 比较T的数据和E,若相等跳到(3),若E小于T->data跳到(4),若E大于T->data则跳到(5) (3) 分析T结点的类型 (3.1)若T是叶子结点则直接删除,树变矮即lower=1: (3.2
Python数据结构——AVL树的实现
既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调整.不过一旦有新叶子的插入我们必须更新其父节点的平衡因子.新叶子会如何影响父节点的平衡因子取决于叶节点是左子节点还是右子节点.如果新节点是右子节点,父节点的平衡因子减 1.如果新节点是左子节点,父节点的平衡因子将加 1.这种关系可以递归地应用于新节点的前两个节点,并有可能影响到之前的每一个甚至是根节
纸上谈兵: AVL树[转]
二叉搜索树的深度与搜索效率 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n.比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参考树, 二叉树, 二叉搜索树).注意,log以2为基底.log(n)是指深度的量级.根据我们对深度的定义,精确的最小深度为floor(log(n)+1). 我们将处于同一深度的节点归为一层.如果除最后一层外的其他层都被节点填满时,二叉树有最小深度log(n). 二