PHP 二叉树 二叉排序树实现

<?php
/**
 * PHP 二叉树
 * @author : xiaojiang 2014-01-01
 * */
class Tree {
    
    protected $k = null;
    protected $left = null;
    protected $right = null;
    
    public function __construct( $k= null , $left = null, $right = null){
    
        $this->k = $k;
        $this->left = $left;
        $this->right = $right;
    }
    
    public function isEmpty(){
        return !isset($this->k);
    }
    
    public function getKey(){
        return isset($this->k) ? $this->k : false;
    }
    
    public function setKey($k){
        
        if(!$this->isEmpty())
            return ;
        $this->k = $k;
        $this->left = new Tree();
        $this->right = new Tree();
        return true;
    }
    
    public function deleteKey(){
        if(!$this->isLeaf())
            return false;
        $ret  = $this->k;
        $this->k = null;
        $this->left = null;
        $this->right = null;
        return $ret;
    }
    
    public function setLeftKey( Tree $obj){
        if( $this->left || !$this->left->isEmpty())
            return false;
        $this->left = $obj;
    }
    
    public function delLeftKey(){
    
        if($this->isEmpty())
            return;
        $ret = $this->left ;
        $this->left = new Tree();
        return $ret;
    }
    
    
    public function setRightKey( Tree $obj){
        if( $this->left || !$this->left->isEmpty())
            return false;
        $this->left = $obj;
    }
    
    public function delRightKey(){
    
        if($this->isEmpty())
            return;
        $ret = $this->left ;
        $this->left = new Tree();
        return $ret;
    }
    
    
}

/**
 * 二叉树排序
 * @author: xiaojiang 
 * */

class bTree extends Tree{
    
    static public function initbTree($array){
        
        $root = new bTree();
        foreach($array as $val){
            $root->insert($val);
        }
        return $root;
    }
    
    public function compare($obj){
        return $this->k - $obj;    
    }
    
    public function contain($obj){
    
        if ($this->isEmpty())
            return false;
        $diff = $this->compare($obj);
        if($diff == 0){
            return true;
        }else if($diff > 0){
            return $this->right->contain($obj);
        }else {
            return $this->left->contain($obj);
        }
    }
    
    public function insert($obj){
        
        if($this->isEmpty()){
            $this->setKey($obj);
        }else{
            $diff = $this->compare($obj);
            if($diff > 0){
                $this->left->insert($obj);
            }else{
                $this->right->insert($obj);
            }
        }
        $this->_afterInsert();
    }
    
    public function findMax(){
        if($this->isEmpty())
            return;
        if(!$this->right->isEmpty())
            return $this->right->findMax();
        else     
            return $this->k;
    }
    
    public function findMin(){
    
        if($this->isEmpty())
            return ;
        if(!$this->left->isEmpty())
            return $this->left->findMin();
        else 
            return $this->k;
    }
    
    public function setKey($k){
        
        if(!$this->isEmpty())
            return ;
        $this->k = $k;
        $this->left = new bTree();
        $this->right = new bTree();
        return true;
    }
    
    protected function _afterInsert(){}
}

$arr = array(1,5,4,5,10);

$btree = bTree::initbTree($arr);

echo $btree->findMax();    // 10 

echo "<br>";

echo $btree->findMin();   // 1

 

非常适用于多数字排序。。避免了批量循环的重复判断··· 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值